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, 4 months ago) by chuckv
File size: 24643 byte(s)
Log Message:
vector class tests correctly.

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.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
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
520
521 resizeFlag = .false.
522
523 ! first time: allocate a new vector with default size
524
525 if (.not. associated(this)) then
526 this => initialize()
527 endif
528
529 oldCapacity = size(this%ElementData)
530 oldPropCap = size(this%PropertyDescriptions)
531
532 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 else
543 newCapacity = oldCapacity
544 endif
545
546 !!! newCapacity is not set.....
547 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 else
558 newPropCap = oldPropCap
559 endif
560
561 if (resizeFlag) then
562 that => initialize(newCapacity, newPropCap, &
563 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 if (v1%PropertyDataType(j) .eq. integer_data_type) &
580 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 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 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 real( kind = 8 ), intent(in) :: PropValue
626 logical :: foundit
627
628 foundit = .false.
629
630 ! first make sure that the PropName isn't in the list of known properties:
631
632 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
639 if (.not.foundit) then
640 call addPropertyToVector(this, PropName, real_data_type)
641 call setElementPropertyReal(this, id, PropName, PropValue)
642 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 logical :: foundit
651
652 foundit = .false.
653 ! 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 logical :: foundit
673
674 foundit = .false.
675 ! 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
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
700 function initialize_0i() result(this)
701 type(Vector), pointer :: this
702 this => initialize_2i(10, 5)
703 end function initialize_0i
704
705 function initialize_1i(nprop) result(this)
706 integer, intent(in) :: nprop
707 type(Vector), pointer :: this
708 this => initialize_2i(10, nprop)
709 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 this => initialize_4i(cap, nprop, 0, 0)
715 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 this => initialize_4i(cap, nprop, capinc, 0)
721 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
728 nullify(this)
729
730 if (cap < 0) then
731 write(*,*) 'Bogus Capacity:', cap
732 return
733 endif
734 if (nprop < 0) then
735 write(*,*) 'Bogus Number of Properties:', nprop
736 return
737 endif
738
739 allocate(this,stat=error)
740 if ( error /= 0 ) then
741 write(*,*) 'Could not allocate Vector!'
742 return
743 end if
744
745 this%initialCapacity = cap
746 this%initialProperties = nprop
747 this%capacityIncrement = capinc
748 this%propertyIncrement = propinc
749
750 allocate(this%elementData(this%initialCapacity), stat=error)
751 if(error /= 0) write(*,*) 'Could not allocate elementData!'
752
753
754 allocate(this%PropertyDescriptions(this%initialProperties), &
755 stat=error)
756 if(error /= 0) write(*,*) 'Could not allocate PropertyDescriptions!'
757
758 allocate(this%PropertyDataType(this%initialProperties), &
759 stat=error)
760 if(error /= 0) write(*,*) 'Could not allocate PropertyDataType!'
761
762 allocate(this%integerElementProperties(this%initialCapacity, &
763 this%initialProperties), stat=error)
764 if(error /= 0) write(*,*) 'Could not allocate integerElementProperties!'
765
766 allocate(this%realElementProperties(this%initialCapacity, &
767 this%initialProperties), stat=error)
768 if(error /= 0) write(*,*) 'Could not allocate realElementProperties!'
769
770 allocate(this%logicalElementProperties(this%initialCapacity, &
771 this%initialProperties), stat=error)
772 if(error .ne. 0) write(*,*) 'Could not allocate logicalElementProperties!'
773
774 end function initialize_4i
775
776
777
778 end module Vector_class