ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE_old/src/mdtools/libmdCode/vector_class.F90
Revision: 344
Committed: Fri Mar 14 18:34:39 2003 UTC (21 years, 4 months ago) by chuckv
File size: 24611 byte(s)
Log Message:
Bug fixes in vector_class.

File Contents

# Content
1 ! vector_class.F90
2 !! Module Vector_class
3 !! Fortran 95 Vector class module. Similar to java.util vector class.
4 !!
5 !! The Vector class implements a growable array of objects. Like an array,
6 !! it contains components that can be accessed using an integer index.
7 !! However, the size of a Vector can grow as needed to accommodate
8 !! adding and removing items after the Vector has been created.
9 !! Each vector tries to optimize storage management by maintaining a
10 !! capacity and a capacityIncrement. The capacity is always at least as
11 !! large as the vector size;
12 !! it is usually larger because as components are added to the vector,
13 !! the vector's storage increases in chunks the size of capacityIncrement.
14 !! An application can increase the capacity of a vector before inserting a
15 !! large number of components; this reduces the amount of incremental
16 !! reallocation.
17 !!
18 !!
19 !! @author J. Daniel Gezelter
20 !! @author Charles F. Vardeman II
21 !! @author Matthew Meineke
22 !! @version $Id: vector_class.F90,v 1.7 2003-03-14 18:34:39 chuckv Exp $, $Date: 2003-03-14 18:34:39 $, $Name: not supported by cvs2svn $, $Revision: 1.7 $
23
24 module Vector_class
25
26 implicit NONE
27 PRIVATE
28
29 public :: initialize
30 public :: getSize
31 public :: getElementAt
32 public :: getPropertyListSize
33 public :: getPropertyNameAt
34 public :: addElement
35 public :: setElementProperty
36 public :: getElementProperty
37 public :: getMatchingElementList
38 public :: getFirstMatchingElement
39
40 integer, parameter :: logical_data_type = 1
41 integer, parameter :: integer_data_type = 2
42 integer, parameter :: real_data_type = 3
43
44 !!
45 type, public :: Vector
46 PRIVATE
47 integer :: initialCapacity = 10
48 integer :: capacityIncrement = 0
49 integer :: elementCount = 0
50
51 integer :: initialProperties = 5
52 integer :: PropertyIncrement = 0
53 integer :: propertyCount = 0
54
55 integer, pointer :: ElementData(:) => null()
56 character(len=100), pointer :: PropertyDescriptions(:) => null()
57 integer, pointer :: PropertyDataType(:) => null()
58 real(kind = 8), pointer :: realElementProperties(:,:) => null()
59 integer, pointer :: integerElementProperties(:,:) => null()
60 logical, pointer :: logicalElementProperties(:,:) => null()
61 end type Vector
62
63 !! Initialize vector
64 interface initialize
65 module procedure initialize_0i
66 module procedure initialize_1i
67 module procedure initialize_2i
68 module procedure initialize_3i
69 module procedure initialize_4i
70 end interface
71
72 interface setElementProperty
73 module procedure setElementPropertyReal
74 module procedure setElementPropertyInt
75 module procedure setElementPropertyLogical
76 end interface
77
78 interface getElementProperty
79 module procedure getElementPropertyReal
80 module procedure getElementPropertyInt
81 module procedure getElementPropertyLogical
82 end interface
83
84 interface getMatchingElementList
85 module procedure getMatchingElementList1i
86 module procedure getMatchingElementList2i
87 module procedure getMatchingElementList1l
88 module procedure getMatchingElementList2l
89 end interface
90
91 interface getFirstMatchingElement
92 module procedure getFirstMatchingElement1i
93 module procedure getFirstMatchingElement2i
94 module procedure getFirstMatchingElement1l
95 module procedure getFirstMatchingElement2l
96 end interface
97 contains
98
99 function getSize(this) result (ne)
100 type(Vector), pointer :: this
101 integer :: ne
102 ne = this%elementCount
103 end function getSize
104
105 function getElementAt(this, loc) result (id)
106 type(Vector), pointer :: this
107 integer, intent(in) :: loc
108 integer :: id
109 id = this%ElementData(loc)
110 end function getElementAt
111
112 function getPropertyListSize(this) result (np)
113 type(Vector), pointer :: this
114 integer :: np
115 np = this%propertyCount
116 end function getPropertyListSize
117
118 function getPropertyNameAt(this, loc) result (pn)
119 type(Vector), pointer :: this
120 integer, intent(in) :: loc
121 character(len=len(this%PropertyDescriptions)) :: pn
122 pn = this%PropertyDescriptions(loc)
123 end function getPropertyNameAt
124
125 function getFirstMatchingElement1i(this, MatchName, MatchValue) result (id)
126 type(Vector), pointer :: this
127 character(len=*), intent(in) :: MatchName
128 integer, intent(in) :: MatchValue
129 integer :: id
130 integer :: i, j
131
132 id = 0
133
134 do i = 1, this%propertyCount
135 if (this%PropertyDescriptions(i) == MatchName) then
136 do j = 1, this%elementCount
137 if (this%integerElementProperties(j, i) == MatchValue) then
138 id = j
139 return
140 endif
141 enddo
142 endif
143 enddo
144 return
145 end function getFirstMatchingElement1i
146
147 function getFirstMatchingElement2i(this, MatchName1, MatchValue1, &
148 MatchName2, MatchValue2) result (id)
149 type(Vector), pointer :: this
150 character(len=*), intent(in) :: MatchName1, MatchName2
151 integer, intent(in) :: MatchValue1, MatchValue2
152 integer :: id
153 integer :: i, j, MatchID1, MatchID2
154 logical :: found1 = .false.
155 logical :: found2 = .false.
156
157 id = 0
158 ! first figure out which properties we are using to do the match:
159
160 do i = 1, this%propertyCount
161 if (this%PropertyDescriptions(i) == MatchName1) then
162 MatchID1 = i
163 found1 = .true.
164 endif
165 if (this%PropertyDescriptions(i) == MatchName2) then
166 MatchID2 = i
167 found2 = .true.
168 endif
169
170 if (found1.and.found2) then
171 do j = 1, this%elementCount
172 if ((this%integerElementProperties(j, MatchID1) == MatchValue1) &
173 .and. &
174 (this%integerElementProperties(j, MatchID2) ==MatchValue2)) &
175 then
176 id = j
177 return
178 endif
179 enddo
180 endif
181 end do
182
183 return
184 end function getFirstMatchingElement2i
185
186 function getFirstMatchingElement1l(this, MatchName, MatchValue) result (id)
187 type(Vector), pointer :: this
188 character(len=*), intent(in) :: MatchName
189 logical, intent(in) :: MatchValue
190 integer :: id
191 integer :: i, j
192
193 id = 0
194
195 do i = 1, this%propertyCount
196 if (this%PropertyDescriptions(i) == MatchName) then
197 do j = 1, this%elementCount
198 if (this%logicalElementProperties(j, i) .eqv. MatchValue) then
199 id = j
200 return
201 endif
202 enddo
203 endif
204 enddo
205 return
206 end function getFirstMatchingElement1l
207
208 function getFirstMatchingElement2l(this, MatchName1, MatchValue1, &
209 MatchName2, MatchValue2) result (id)
210 type(Vector), pointer :: this
211 character(len=*), intent(in) :: MatchName1, MatchName2
212 logical, intent(in) :: MatchValue1, MatchValue2
213 integer :: id
214 integer :: i, j, MatchID1, MatchID2
215 logical :: found1 = .false.
216 logical :: found2 = .false.
217
218 id = 0
219 ! first figure out which properties we are using to do the match:
220
221 do i = 1, this%propertyCount
222 if (this%PropertyDescriptions(i) == MatchName1) then
223 MatchID1 = i
224 found1 = .true.
225 endif
226 if (this%PropertyDescriptions(i) == MatchName2) then
227 MatchID2 = i
228 found2 = .true.
229 endif
230
231 if (found1.and.found2) then
232 do j = 1, this%elementCount
233 if ((this%logicalElementProperties(j, MatchID1).eqv.MatchValue1) &
234 .and. &
235 (this%logicalElementProperties(j, MatchID2).eqv.MatchValue2)) &
236 then
237 id = j
238 return
239 endif
240 enddo
241 endif
242 end do
243
244 return
245 end function getFirstMatchingElement2l
246
247 subroutine getMatchingElementList1i(this, MatchName, MatchValue, &
248 nMatches, MatchList)
249 type(Vector), pointer :: this
250 character(len=*), intent(in) :: MatchName
251 integer, intent(in) :: MatchValue
252 integer, intent(out) :: nMatches
253 integer, pointer :: MatchList(:)
254 integer :: i
255
256 ! first figure out which property we are using to do the match:
257
258 do i = 1, this%propertyCount
259 if (this%PropertyDescriptions(i) == MatchName) then
260 call getAllMatches1i(this, i, MatchValue, nMatches, MatchList)
261 return
262 endif
263 enddo
264 return
265 end subroutine getMatchingElementList1i
266
267 subroutine getMatchingElementList2i(this, MatchName1, MatchValue1, &
268 MatchName2, MatchValue2, nMatches, MatchList)
269 type(Vector), pointer :: this
270 character(len=*), intent(in) :: MatchName1, MatchName2
271 integer, intent(in) :: MatchValue1, MatchValue2
272 integer, intent(out) :: nMatches
273 integer, pointer :: MatchList(:)
274 integer :: i, MatchID1, MatchID2
275 logical :: found1 = .false.
276 logical :: found2 = .false.
277
278 ! first figure out which properties we are using to do the match:
279
280 do i = 1, this%propertyCount
281 if (this%PropertyDescriptions(i) == MatchName1) then
282 MatchID1 = i
283 found1 = .true.
284 endif
285 if (this%PropertyDescriptions(i) == MatchName2) then
286 MatchID2 = i
287 found2 = .true.
288 endif
289
290 if (found1.and.found2) then
291 call getAllMatches2i(this, MatchID1, MatchValue1, &
292 MatchID2, MatchValue2, nMatches, MatchList)
293 return
294 endif
295 enddo
296 return
297 end subroutine getMatchingElementList2i
298
299 subroutine getMatchingElementList1l(this, MatchName, MatchValue, &
300 nMatches, MatchList)
301 type(Vector), pointer :: this
302 character(len=*), intent(in) :: MatchName
303 logical, intent(in) :: MatchValue
304 integer, intent(out) :: nMatches
305 integer, pointer :: MatchList(:)
306 integer :: i
307
308 ! first figure out which property we are using to do the match:
309
310 do i = 1, this%propertyCount
311 if (this%PropertyDescriptions(i) == MatchName) then
312 call getAllMatches1l(this, i, MatchValue, nMatches, MatchList)
313 return
314 endif
315 enddo
316 return
317 end subroutine getMatchingElementList1l
318
319 subroutine getMatchingElementList2l(this, MatchName1, MatchValue1, &
320 MatchName2, MatchValue2, nMatches, MatchList)
321 type(Vector), pointer :: this
322 character(len=*), intent(in) :: MatchName1, MatchName2
323 logical, intent(in) :: MatchValue1, MatchValue2
324 integer, intent(out) :: nMatches
325 integer, pointer :: MatchList(:)
326 integer :: i, MatchID1, MatchID2
327 logical :: found1 = .false.
328 logical :: found2 = .false.
329
330 ! first figure out which properties we are using to do the match:
331
332 do i = 1, this%propertyCount
333 if (this%PropertyDescriptions(i) == MatchName1) then
334 MatchID1 = i
335 found1 = .true.
336 endif
337 if (this%PropertyDescriptions(i) == MatchName2) then
338 MatchID2 = i
339 found2 = .true.
340 endif
341
342 if (found1.and.found2) then
343 call getAllMatches2l(this, MatchID1, MatchValue1, &
344 MatchID2, MatchValue2, nMatches, MatchList)
345 return
346 endif
347 enddo
348 return
349 end subroutine getMatchingElementList2l
350
351 subroutine getAllMatches1i(this, MatchID, MatchValue, nMatches, MatchList)
352 type(Vector), pointer :: this
353 integer, intent(in) :: MatchID
354 integer, intent(in) :: MatchValue
355 integer, pointer :: MatchList(:)
356 integer, intent(out) :: nMatches
357 integer :: error, i
358
359 allocate(MatchList(this%elementCount), stat=error)
360 if(error .ne. 0) write(*,*) 'Could not allocate MatchList!'
361
362 nMatches = 0
363
364 do i = 1, this%elementCount
365 if (this%integerElementProperties(i, MatchID) == MatchValue) then
366 nMatches = nMatches + 1
367 MatchList(nMatches) = i
368 endif
369 enddo
370 end subroutine getAllMatches1i
371
372 subroutine getAllMatches2i(this, MatchID1, MatchValue1, &
373 MatchID2, MatchValue2, nMatches, MatchList)
374 type(Vector), pointer :: this
375 integer, intent(in) :: MatchID1, MatchID2
376 integer, intent(in) :: MatchValue1, MatchValue2
377 integer, pointer :: MatchList(:)
378 integer, intent(out) :: nMatches
379 integer :: error, i
380
381 allocate(MatchList(this%elementCount), stat=error)
382 if(error .ne. 0) write(*,*) 'Could not allocate MatchList!'
383
384 nMatches = 0
385
386 do i = 1, this%elementCount
387 if ((this%integerElementProperties(i, MatchID1) == MatchValue1) .and. &
388 (this%integerElementProperties(i, MatchID2) == MatchValue2)) then
389 nMatches = nMatches + 1
390 MatchList(nMatches) = i
391 endif
392 enddo
393 end subroutine getAllMatches2i
394
395 subroutine getAllMatches1l(this, MatchID, MatchValue, nMatches, MatchList)
396 type(Vector), pointer :: this
397 integer, intent(in) :: MatchID
398 logical, intent(in) :: MatchValue
399 integer, pointer :: MatchList(:)
400 integer, intent(out) :: nMatches
401 integer :: error, i
402
403 allocate(MatchList(this%elementCount), stat=error)
404 if(error .ne. 0) write(*,*) 'Could not allocate MatchList!'
405
406 nMatches = 0
407
408 do i = 1, this%elementCount
409 if (this%logicalElementProperties(i, MatchID).eqv.MatchValue) then
410 nMatches = nMatches + 1
411 MatchList(nMatches) = i
412 endif
413 enddo
414 end subroutine getAllMatches1l
415
416 subroutine getAllMatches2l(this, MatchID1, MatchValue1, &
417 MatchID2, MatchValue2, nMatches, MatchList)
418 type(Vector), pointer :: this
419 integer, intent(in) :: MatchID1, MatchID2
420 logical, intent(in) :: MatchValue1, MatchValue2
421 integer, pointer :: MatchList(:)
422 integer, intent(out) :: nMatches
423 integer :: error, i
424
425 allocate(MatchList(this%elementCount), stat=error)
426 if(error .ne. 0) write(*,*) 'Could not allocate MatchList!'
427
428 nMatches = 0
429
430 do i = 1, this%elementCount
431 if ((this%logicalElementProperties(i, MatchID1).eqv.MatchValue1) .and. &
432 (this%logicalElementProperties(i, MatchID2).eqv.MatchValue2)) then
433 nMatches = nMatches + 1
434 MatchList(nMatches) = i
435 endif
436 enddo
437 end subroutine getAllMatches2l
438
439
440 subroutine getElementPropertyReal(this, id, PropName, pv)
441 type(Vector), pointer :: this
442 integer :: id, whichprop
443 character(len=*) :: PropName
444 real( kind = 8 ) :: pv
445
446 whichprop = getPropertyIndex(this, PropName)
447 if (whichprop .eq. 0 ) then
448 write(*,*) 'unknown property! ', PropName
449 pv = 0.0
450 else
451 if (this%PropertyDataType(whichprop) .ne. real_data_type) then
452 write(*,*) 'Property! ', PropName, " is not real data type."
453 pv = 0.0
454 else
455 pv = this%realElementProperties(id, whichprop)
456 endif
457 endif
458 end subroutine getElementPropertyReal
459
460 subroutine getElementPropertyInt(this, id, PropName, pv)
461 type(Vector), pointer :: this
462 integer :: id, whichprop
463 character(len=*) :: PropName
464 integer :: pv
465
466 whichprop = getPropertyIndex(this, PropName)
467 if (whichprop .eq. 0 ) then
468 write(*,*) 'unknown property! ', PropName
469 pv = 0
470 else
471 if (this%PropertyDataType(whichprop) .ne. integer_data_type) then
472 write(*,*) 'Property! ', PropName, " is not integer data type."
473 pv = 0
474 else
475 pv = this%integerElementProperties(id, whichprop)
476 endif
477 endif
478 end subroutine getElementPropertyInt
479
480 subroutine getElementPropertyLogical(this, id, PropName, pv)
481 type(Vector), pointer :: this
482 integer :: id, whichprop
483 character(len=*) :: PropName
484 logical :: pv
485
486 whichprop = getPropertyIndex(this, PropName)
487 if (whichprop .eq. 0 ) then
488 write(*,*) 'unknown property! ', PropName
489 pv = .false.
490 else
491 if (this%PropertyDataType(whichprop) .ne. logical_data_type) then
492 write(*,*) 'Property! ', PropName, " is not logical data type."
493 pv = .false.
494 else
495 pv = this%logicalElementProperties(id, whichprop)
496 endif
497 endif
498 end subroutine getElementPropertyLogical
499
500 function getPropertyIndex(this, PropName) result (id)
501 type(Vector), pointer :: this
502 integer :: id, i
503 character(len=*) :: PropName
504
505 do i = 1, this%propertyCount
506 if (this%PropertyDescriptions(i) == PropName) then
507 id = i
508 return
509 endif
510 enddo
511 id = 0
512 end function getPropertyIndex
513
514 subroutine ensureCapacityHelper(this, minCapacity, minPropCap)
515 type(Vector), pointer :: this, that
516 integer, intent(in) :: minCapacity, minPropCap
517 integer :: oldCapacity, oldPropCap
518 integer :: newCapacity, newPropCap
519 logical :: resizeFlag = .false.
520
521
522 ! first time: allocate a new vector with default size
523 if (.not. associated(this)) then
524 this => initialize()
525 endif
526
527 oldCapacity = size(this%ElementData)
528 oldPropCap = size(this%PropertyDescriptions)
529
530
531 if (minCapacity > oldCapacity) then
532 if (this%capacityIncrement .gt. 0) then
533 newCapacity = oldCapacity + this%capacityIncrement
534 else
535 newCapacity = oldCapacity * 2
536 endif
537 if (newCapacity .lt. minCapacity) then
538 newCapacity = minCapacity
539 endif
540 resizeFlag = .true.
541 endif
542
543 !!! newCapacity is not set.....
544 if (minPropCap > oldPropCap) then
545 if (this%PropertyIncrement .gt. 0) then
546 newPropCap = oldPropCap + this%PropertyIncrement
547 else
548 newPropCap = oldPropCap * 2
549 endif
550 if (newPropCap .lt. minPropCap) then
551 newPropCap = minPropCap
552 endif
553 resizeFlag = .true.
554 endif
555
556 if (resizeFlag) then
557 write(*,*) "Resizing to new capacity: ",newCapacity
558 that => initialize(newCapacity, newPropCap, &
559 this%capacityIncrement, this%PropertyIncrement)
560 call copyAllData(this, that)
561 deallocate(this)
562 this => that
563 endif
564 end subroutine ensureCapacityHelper
565
566 subroutine copyAllData(v1, v2)
567 type(Vector), pointer :: v1
568 type(Vector), pointer :: v2
569 integer :: i, j
570
571 do i = 1, v1%elementCount
572 v2%elementData(i) = v1%elementData(i)
573 do j = 1, v1%propertyCount
574
575 if (v1%PropertyDataType(j) .eq. integer_data_type) &
576 v2%integerElementProperties(i,j) = &
577 v1%integerElementProperties(i,j)
578
579 if (v1%PropertyDataType(j) .eq. real_data_type) &
580 v2%realElementProperties(i,j) = v1%realElementProperties(i,j)
581
582 if (v1%PropertyDataType(j) .eq. logical_data_type) &
583 v2%logicalElementProperties(i,j) = &
584 v1%logicalElementProperties(i,j)
585 enddo
586 enddo
587
588 do j = 1, v1%propertyCount
589 v2%PropertyDescriptions(j) = v1%PropertyDescriptions(j)
590 v2%PropertyDataType(j) = v1%PropertyDataType(j)
591 enddo
592
593 v2%elementCount = v1%elementCount
594 v2%propertyCount = v1%propertyCount
595
596 return
597 end subroutine copyAllData
598
599 function addElement(this) result (id)
600 type(Vector), pointer :: this
601 integer :: id
602 integer :: error
603
604 if (.not. associated(this)) then
605 call ensureCapacityHelper(this,1,0)
606 else
607 call ensureCapacityHelper(this, this%elementCount + 1, this%PropertyCount)
608 end if
609
610 this%elementCount = this%elementCount + 1
611 this%elementData = this%elementCount
612 id = this%elementCount
613
614
615 end function addElement
616
617 recursive subroutine setElementPropertyReal(this, id, PropName, PropValue)
618 type(Vector), pointer :: this
619 integer :: id, i
620 character(len=*), intent(in) :: PropName
621 real( kind = 8 ), intent(in) :: PropValue
622 logical :: foundit
623
624 foundit = .false.
625
626 ! first make sure that the PropName isn't in the list of known properties:
627
628 do i = 1, this%propertyCount
629 if (PropName == this%PropertyDescriptions(i)) then
630 foundit = .true.
631 this%realElementProperties(id,i) = PropValue
632 endif
633 enddo
634
635 if (.not.foundit) then
636 call addPropertyToVector(this, PropName, real_data_type)
637 call setElementPropertyReal(this, id, PropName, PropValue)
638 endif
639 end subroutine setElementPropertyReal
640
641 recursive subroutine setElementPropertyInt(this, id, PropName, PropValue)
642 type(Vector), pointer :: this
643 integer :: id, i
644 character(len=*), intent(in) :: PropName
645 integer, intent(in) :: PropValue
646 logical :: foundit
647
648 foundit = .false.
649 ! first make sure that the PropName isn't in the list of known properties:
650 do i = 1, this%propertyCount
651 if (PropName == this%PropertyDescriptions(i)) then
652 foundit = .true.
653 this%integerElementProperties(id,i) = PropValue
654 endif
655 enddo
656
657 if (.not.foundit) then
658 call addPropertyToVector(this, PropName, integer_data_type)
659 call setElementPropertyInt(this, id, PropName, PropValue)
660 endif
661 end subroutine setElementPropertyInt
662
663 recursive subroutine setElementPropertyLogical(this, id, PropName, PropValue)
664 type(Vector), pointer :: this
665 integer :: id, i
666 character(len=*), intent(in) :: PropName
667 logical, intent(in) :: PropValue
668 logical :: foundit
669
670 foundit = .false.
671 ! first make sure that the PropName isn't in the list of known properties:
672 do i = 1, this%propertyCount
673 if (PropName == this%PropertyDescriptions(i)) then
674 foundit = .true.
675 this%logicalElementProperties(id,i) = PropValue
676 endif
677 enddo
678
679 if (.not.foundit) then
680 call addPropertyToVector(this, PropName, logical_data_type)
681 call setElementPropertyLogical(this, id, PropName, PropValue)
682 endif
683 end subroutine setElementPropertyLogical
684
685 subroutine addPropertyToVector(this, PropName, data_type)
686 type(Vector), pointer :: this
687 character(len=*), intent(in) :: PropName
688 integer data_type
689
690 call ensureCapacityHelper(this, this%elementCount, this%propertyCount + 1)
691 this%propertyCount = this%propertyCount + 1
692 this%PropertyDescriptions(this%propertyCount) = PropName
693 this%PropertyDataType(this%propertyCount) = data_type
694 end subroutine addPropertyToVector
695
696 function initialize_0i() result(this)
697 type(Vector), pointer :: this
698 this => initialize_2i(10, 5)
699 end function initialize_0i
700
701 function initialize_1i(nprop) result(this)
702 integer, intent(in) :: nprop
703 type(Vector), pointer :: this
704 this => initialize_2i(10, nprop)
705 end function initialize_1i
706
707 function initialize_2i(cap, nprop) result(this)
708 integer, intent(in) :: cap, nprop
709 type(Vector), pointer :: this
710 this => initialize_4i(cap, nprop, 0, 0)
711 end function initialize_2i
712
713 function initialize_3i(cap, nprop, capinc) result(this)
714 integer, intent(in) :: cap, nprop, capinc
715 type(Vector), pointer :: this
716 this => initialize_4i(cap, nprop, capinc, 0)
717 end function initialize_3i
718
719 function initialize_4i(cap, nprop, capinc, propinc) result(this)
720 integer, intent(in) :: cap, nprop, capinc, propinc
721 integer :: error
722 type(Vector), pointer :: this
723
724 nullify(this)
725
726 if (cap < 0) then
727 write(*,*) 'Bogus Capacity:', cap
728 return
729 endif
730 if (nprop < 0) then
731 write(*,*) 'Bogus Number of Properties:', nprop
732 return
733 endif
734
735 allocate(this,stat=error)
736 if ( error /= 0 ) then
737 write(*,*) 'Could not allocate Vector!'
738 return
739 end if
740
741 allocate(this%elementData(this%initialCapacity), stat=error)
742 if(error /= 0) write(*,*) 'Could not allocate elementData!'
743
744
745 allocate(this%PropertyDescriptions(this%initialProperties), &
746 stat=error)
747 if(error /= 0) write(*,*) 'Could not allocate PropertyDescriptions!'
748
749 allocate(this%PropertyDataType(this%initialProperties), &
750 stat=error)
751 if(error /= 0) write(*,*) 'Could not allocate PropertyDataType!'
752
753 allocate(this%integerElementProperties(this%initialCapacity, &
754 this%initialProperties), stat=error)
755 if(error /= 0) write(*,*) 'Could not allocate integerElementProperties!'
756
757 allocate(this%realElementProperties(this%initialCapacity, &
758 this%initialProperties), stat=error)
759 if(error /= 0) write(*,*) 'Could not allocate realElementProperties!'
760
761 allocate(this%logicalElementProperties(this%initialCapacity, &
762 this%initialProperties), stat=error)
763 if(error .ne. 0) write(*,*) 'Could not allocate logicalElementProperties!'
764
765
766
767
768 this%initialCapacity = cap
769 this%initialProperties = nprop
770 this%capacityIncrement = capinc
771 this%propertyIncrement = propinc
772
773
774 end function initialize_4i
775
776
777
778 end module Vector_class