ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE_old/src/mdtools/libmdCode/vector_class.F90
Revision: 346
Committed: Fri Mar 14 19:51:11 2003 UTC (21 years, 5 months ago) by chuckv
File size: 24643 byte(s)
Log Message:
vector class tests correctly.

File Contents

# User Rev Content
1 chuckv 315 ! 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 gezelter 316 !! 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 chuckv 315 !! adding and removing items after the Vector has been created.
9 gezelter 316 !! 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 chuckv 315 !! 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 gezelter 316 !! 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 chuckv 315 !!
18     !!
19     !! @author J. Daniel Gezelter
20     !! @author Charles F. Vardeman II
21     !! @author Matthew Meineke
22 chuckv 346 !! @version $Id: vector_class.F90,v 1.8 2003-03-14 19:51:11 chuckv Exp $, $Date: 2003-03-14 19:51:11 $, $Name: not supported by cvs2svn $, $Revision: 1.8 $
23 chuckv 315
24 gezelter 312 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 gezelter 313 public :: getMatchingElementList
38     public :: getFirstMatchingElement
39 gezelter 312
40     integer, parameter :: logical_data_type = 1
41     integer, parameter :: integer_data_type = 2
42     integer, parameter :: real_data_type = 3
43    
44 chuckv 315 !!
45 gezelter 312 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 chuckv 315 integer, pointer :: ElementData(:) => null()
56     character(len=100), pointer :: PropertyDescriptions(:) => null()
57     integer, pointer :: PropertyDataType(:) => null()
58 gezelter 316 real(kind = 8), pointer :: realElementProperties(:,:) => null()
59 chuckv 315 integer, pointer :: integerElementProperties(:,:) => null()
60     logical, pointer :: logicalElementProperties(:,:) => null()
61 gezelter 312 end type Vector
62    
63 chuckv 315 !! Initialize vector
64 gezelter 312 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 gezelter 313
84     interface getMatchingElementList
85     module procedure getMatchingElementList1i
86     module procedure getMatchingElementList2i
87 gezelter 316 module procedure getMatchingElementList1l
88     module procedure getMatchingElementList2l
89 gezelter 313 end interface
90    
91     interface getFirstMatchingElement
92     module procedure getFirstMatchingElement1i
93     module procedure getFirstMatchingElement2i
94 gezelter 316 module procedure getFirstMatchingElement1l
95     module procedure getFirstMatchingElement2l
96 gezelter 313 end interface
97 gezelter 312 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 gezelter 313 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 gezelter 316 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 gezelter 313
195 gezelter 316 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 gezelter 313 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 gezelter 316 integer, pointer :: MatchList(:)
254 gezelter 313 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 gezelter 316 call getAllMatches1i(this, i, MatchValue, nMatches, MatchList)
261 gezelter 313 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 gezelter 314 integer, intent(in) :: MatchValue1, MatchValue2
272     integer, intent(out) :: nMatches
273     integer, pointer :: MatchList(:)
274 gezelter 313 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 gezelter 316
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 gezelter 313
330 gezelter 316 ! 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 gezelter 313 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 gezelter 316
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 gezelter 313
403 gezelter 316 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 gezelter 313
440 gezelter 312 subroutine getElementPropertyReal(this, id, PropName, pv)
441     type(Vector), pointer :: this
442     integer :: id, whichprop
443     character(len=*) :: PropName
444 gezelter 316 real( kind = 8 ) :: pv
445 gezelter 312
446     whichprop = getPropertyIndex(this, PropName)
447     if (whichprop .eq. 0 ) then
448 chuckv 346 write(*,*) 'unknown property: ', PropName
449 gezelter 312 pv = 0.0
450     else
451     if (this%PropertyDataType(whichprop) .ne. real_data_type) then
452 chuckv 346 write(*,*) 'Property: ', PropName, " is not real data type."
453 gezelter 312 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 chuckv 344 write(*,*) 'unknown property! ', PropName
469 gezelter 312 pv = 0
470     else
471     if (this%PropertyDataType(whichprop) .ne. integer_data_type) then
472 chuckv 344 write(*,*) 'Property! ', PropName, " is not integer data type."
473 gezelter 312 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 chuckv 344 write(*,*) 'unknown property! ', PropName
489 gezelter 312 pv = .false.
490     else
491     if (this%PropertyDataType(whichprop) .ne. logical_data_type) then
492 chuckv 344 write(*,*) 'Property! ', PropName, " is not logical data type."
493 gezelter 312 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 chuckv 344
505 gezelter 312 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 chuckv 346 logical :: resizeFlag
520 gezelter 312
521 chuckv 346 resizeFlag = .false.
522 chuckv 344
523     ! first time: allocate a new vector with default size
524 chuckv 346
525 chuckv 344 if (.not. associated(this)) then
526     this => initialize()
527     endif
528    
529 gezelter 312 oldCapacity = size(this%ElementData)
530 chuckv 344 oldPropCap = size(this%PropertyDescriptions)
531    
532 gezelter 312 if (minCapacity > oldCapacity) then
533     if (this%capacityIncrement .gt. 0) then
534     newCapacity = oldCapacity + this%capacityIncrement
535     else
536     newCapacity = oldCapacity * 2
537     endif
538     if (newCapacity .lt. minCapacity) then
539     newCapacity = minCapacity
540     endif
541     resizeFlag = .true.
542 chuckv 346 else
543     newCapacity = oldCapacity
544 gezelter 312 endif
545 chuckv 344
546     !!! newCapacity is not set.....
547 gezelter 312 if (minPropCap > oldPropCap) then
548     if (this%PropertyIncrement .gt. 0) then
549     newPropCap = oldPropCap + this%PropertyIncrement
550     else
551     newPropCap = oldPropCap * 2
552     endif
553     if (newPropCap .lt. minPropCap) then
554     newPropCap = minPropCap
555     endif
556     resizeFlag = .true.
557 chuckv 346 else
558     newPropCap = oldPropCap
559 gezelter 312 endif
560 chuckv 344
561 gezelter 312 if (resizeFlag) then
562 chuckv 344 that => initialize(newCapacity, newPropCap, &
563 gezelter 312 this%capacityIncrement, this%PropertyIncrement)
564     call copyAllData(this, that)
565     deallocate(this)
566     this => that
567     endif
568     end subroutine ensureCapacityHelper
569    
570     subroutine copyAllData(v1, v2)
571     type(Vector), pointer :: v1
572     type(Vector), pointer :: v2
573     integer :: i, j
574    
575     do i = 1, v1%elementCount
576     v2%elementData(i) = v1%elementData(i)
577     do j = 1, v1%propertyCount
578    
579 chuckv 346 if (v1%PropertyDataType(j) .eq. integer_data_type) &
580 gezelter 312 v2%integerElementProperties(i,j) = &
581     v1%integerElementProperties(i,j)
582    
583     if (v1%PropertyDataType(j) .eq. real_data_type) &
584     v2%realElementProperties(i,j) = v1%realElementProperties(i,j)
585    
586     if (v1%PropertyDataType(j) .eq. logical_data_type) &
587     v2%logicalElementProperties(i,j) = &
588     v1%logicalElementProperties(i,j)
589     enddo
590     enddo
591    
592     do j = 1, v1%propertyCount
593     v2%PropertyDescriptions(j) = v1%PropertyDescriptions(j)
594     v2%PropertyDataType(j) = v1%PropertyDataType(j)
595     enddo
596    
597     v2%elementCount = v1%elementCount
598     v2%propertyCount = v1%propertyCount
599    
600     return
601     end subroutine copyAllData
602    
603     function addElement(this) result (id)
604     type(Vector), pointer :: this
605     integer :: id
606 chuckv 344 integer :: error
607    
608     if (.not. associated(this)) then
609     call ensureCapacityHelper(this,1,0)
610     else
611     call ensureCapacityHelper(this, this%elementCount + 1, this%PropertyCount)
612     end if
613    
614     this%elementCount = this%elementCount + 1
615     this%elementData = this%elementCount
616     id = this%elementCount
617    
618    
619 gezelter 312 end function addElement
620    
621     recursive subroutine setElementPropertyReal(this, id, PropName, PropValue)
622     type(Vector), pointer :: this
623     integer :: id, i
624     character(len=*), intent(in) :: PropName
625 gezelter 316 real( kind = 8 ), intent(in) :: PropValue
626 chuckv 344 logical :: foundit
627    
628     foundit = .false.
629    
630 gezelter 312 ! first make sure that the PropName isn't in the list of known properties:
631 chuckv 344
632 gezelter 312 do i = 1, this%propertyCount
633     if (PropName == this%PropertyDescriptions(i)) then
634     foundit = .true.
635     this%realElementProperties(id,i) = PropValue
636     endif
637     enddo
638 chuckv 344
639 gezelter 312 if (.not.foundit) then
640 chuckv 344 call addPropertyToVector(this, PropName, real_data_type)
641     call setElementPropertyReal(this, id, PropName, PropValue)
642 gezelter 312 endif
643     end subroutine setElementPropertyReal
644    
645     recursive subroutine setElementPropertyInt(this, id, PropName, PropValue)
646     type(Vector), pointer :: this
647     integer :: id, i
648     character(len=*), intent(in) :: PropName
649     integer, intent(in) :: PropValue
650 chuckv 344 logical :: foundit
651    
652     foundit = .false.
653 gezelter 312 ! first make sure that the PropName isn't in the list of known properties:
654     do i = 1, this%propertyCount
655     if (PropName == this%PropertyDescriptions(i)) then
656     foundit = .true.
657     this%integerElementProperties(id,i) = PropValue
658     endif
659     enddo
660    
661     if (.not.foundit) then
662     call addPropertyToVector(this, PropName, integer_data_type)
663     call setElementPropertyInt(this, id, PropName, PropValue)
664     endif
665     end subroutine setElementPropertyInt
666    
667     recursive subroutine setElementPropertyLogical(this, id, PropName, PropValue)
668     type(Vector), pointer :: this
669     integer :: id, i
670     character(len=*), intent(in) :: PropName
671     logical, intent(in) :: PropValue
672 chuckv 344 logical :: foundit
673    
674     foundit = .false.
675 gezelter 312 ! first make sure that the PropName isn't in the list of known properties:
676     do i = 1, this%propertyCount
677     if (PropName == this%PropertyDescriptions(i)) then
678     foundit = .true.
679     this%logicalElementProperties(id,i) = PropValue
680     endif
681     enddo
682    
683     if (.not.foundit) then
684     call addPropertyToVector(this, PropName, logical_data_type)
685     call setElementPropertyLogical(this, id, PropName, PropValue)
686     endif
687     end subroutine setElementPropertyLogical
688    
689     subroutine addPropertyToVector(this, PropName, data_type)
690     type(Vector), pointer :: this
691     character(len=*), intent(in) :: PropName
692     integer data_type
693 chuckv 344
694     call ensureCapacityHelper(this, this%elementCount, this%propertyCount + 1)
695     this%propertyCount = this%propertyCount + 1
696     this%PropertyDescriptions(this%propertyCount) = PropName
697     this%PropertyDataType(this%propertyCount) = data_type
698     end subroutine addPropertyToVector
699 gezelter 312
700     function initialize_0i() result(this)
701     type(Vector), pointer :: this
702 chuckv 344 this => initialize_2i(10, 5)
703 gezelter 312 end function initialize_0i
704    
705     function initialize_1i(nprop) result(this)
706     integer, intent(in) :: nprop
707     type(Vector), pointer :: this
708 chuckv 344 this => initialize_2i(10, nprop)
709 gezelter 312 end function initialize_1i
710    
711     function initialize_2i(cap, nprop) result(this)
712     integer, intent(in) :: cap, nprop
713     type(Vector), pointer :: this
714 chuckv 344 this => initialize_4i(cap, nprop, 0, 0)
715 gezelter 312 end function initialize_2i
716    
717     function initialize_3i(cap, nprop, capinc) result(this)
718     integer, intent(in) :: cap, nprop, capinc
719     type(Vector), pointer :: this
720 chuckv 344 this => initialize_4i(cap, nprop, capinc, 0)
721 gezelter 312 end function initialize_3i
722    
723     function initialize_4i(cap, nprop, capinc, propinc) result(this)
724     integer, intent(in) :: cap, nprop, capinc, propinc
725     integer :: error
726     type(Vector), pointer :: this
727 chuckv 344
728 gezelter 312 nullify(this)
729 chuckv 344
730     if (cap < 0) then
731 gezelter 312 write(*,*) 'Bogus Capacity:', cap
732 gezelter 317 return
733 gezelter 312 endif
734 chuckv 315 if (nprop < 0) then
735 gezelter 312 write(*,*) 'Bogus Number of Properties:', nprop
736 gezelter 317 return
737 gezelter 312 endif
738 chuckv 344
739     allocate(this,stat=error)
740     if ( error /= 0 ) then
741     write(*,*) 'Could not allocate Vector!'
742     return
743     end if
744 chuckv 346
745     this%initialCapacity = cap
746     this%initialProperties = nprop
747     this%capacityIncrement = capinc
748     this%propertyIncrement = propinc
749 chuckv 344
750 gezelter 312 allocate(this%elementData(this%initialCapacity), stat=error)
751 chuckv 315 if(error /= 0) write(*,*) 'Could not allocate elementData!'
752 chuckv 344
753    
754 gezelter 312 allocate(this%PropertyDescriptions(this%initialProperties), &
755     stat=error)
756 chuckv 315 if(error /= 0) write(*,*) 'Could not allocate PropertyDescriptions!'
757 gezelter 312
758 chuckv 344 allocate(this%PropertyDataType(this%initialProperties), &
759     stat=error)
760     if(error /= 0) write(*,*) 'Could not allocate PropertyDataType!'
761    
762 gezelter 312 allocate(this%integerElementProperties(this%initialCapacity, &
763     this%initialProperties), stat=error)
764 chuckv 315 if(error /= 0) write(*,*) 'Could not allocate integerElementProperties!'
765 gezelter 312
766     allocate(this%realElementProperties(this%initialCapacity, &
767     this%initialProperties), stat=error)
768 chuckv 315 if(error /= 0) write(*,*) 'Could not allocate realElementProperties!'
769 gezelter 312
770     allocate(this%logicalElementProperties(this%initialCapacity, &
771     this%initialProperties), stat=error)
772     if(error .ne. 0) write(*,*) 'Could not allocate logicalElementProperties!'
773    
774 chuckv 344 end function initialize_4i
775    
776    
777    
778 gezelter 312 end module Vector_class