ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE_old/src/mdtools/libmdCode/vector_class.F90
(Generate patch)

Comparing trunk/OOPSE_old/src/mdtools/libmdCode/vector_class.F90 (file contents):
Revision 312 by gezelter, Tue Mar 11 17:46:18 2003 UTC vs.
Revision 316 by gezelter, Tue Mar 11 21:24:04 2003 UTC

# Line 1 | Line 1
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.5 2003-03-11 21:24:04 gezelter Exp $, $Date: 2003-03-11 21:24:04 $, $Name: not supported by cvs2svn $, $Revision: 1.5 $
23 +
24   module Vector_class
25    
26    implicit NONE
# Line 11 | Line 34 | module Vector_class
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
# Line 26 | Line 52 | module Vector_class
52       integer :: PropertyIncrement = 0
53       integer :: propertyCount = 0
54      
55 <     integer, pointer :: ElementData(:)
56 <     character(len=100), pointer :: PropertyDescriptions(:)
57 <     integer, pointer :: PropertyDataType(:)
58 <     real(kind = 8), pointer :: realElementProperties(:,:)
59 <     integer, pointer :: integerElementProperties(:,:)
60 <     logical, pointer :: logicalElementProperties(:,:)
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
# Line 53 | Line 80 | contains
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)
# Line 81 | Line 122 | contains
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
444 >    real( kind = 8 ) :: pv
445      
446      whichprop = getPropertyIndex(this, PropName)
447      if (whichprop .eq. 0 ) then
# Line 245 | Line 600 | contains
600      type(Vector), pointer :: this
601      integer :: id, i
602      character(len=*), intent(in) :: PropName
603 <    real( kind=8 ), intent(in) :: PropValue
603 >    real( kind = 8 ), intent(in) :: PropValue
604      logical :: foundit = .false.
605      ! first make sure that the PropName isn't in the list of known properties:
606      do i = 1, this%propertyCount
# Line 343 | Line 698 | contains
698      integer :: error
699      type(Vector), pointer :: this
700      nullify(this)
701 <    if (cap .lt. 0) then
701 >    if (cap < 0) then
702         write(*,*) 'Bogus Capacity:', cap
703         stop
704      endif
705 <    if (nprop .lt. 0) then
705 >    if (nprop < 0) then
706         write(*,*) 'Bogus Number of Properties:', nprop
707         stop
708      endif
# Line 361 | Line 716 | contains
716      this%propertyIncrement = propinc
717  
718      allocate(this%elementData(this%initialCapacity), stat=error)
719 <    if(error .ne. 0) write(*,*) 'Could not allocate elementData!'
719 >    if(error /= 0) write(*,*) 'Could not allocate elementData!'
720      
721      allocate(this%PropertyDescriptions(this%initialProperties), &
722           stat=error)
723 <    if(error .ne. 0) write(*,*) 'Could not allocate PropertyDescriptions!'
723 >    if(error /=  0) write(*,*) 'Could not allocate PropertyDescriptions!'
724  
725      allocate(this%integerElementProperties(this%initialCapacity, &
726           this%initialProperties), stat=error)
727 <    if(error .ne. 0) write(*,*) 'Could not allocate integerElementProperties!'
727 >    if(error /= 0) write(*,*) 'Could not allocate integerElementProperties!'
728  
729      allocate(this%realElementProperties(this%initialCapacity, &
730           this%initialProperties), stat=error)
731 <    if(error .ne. 0) write(*,*) 'Could not allocate realElementProperties!'  
731 >    if(error /= 0) write(*,*) 'Could not allocate realElementProperties!'  
732  
733      allocate(this%logicalElementProperties(this%initialCapacity, &
734           this%initialProperties), stat=error)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines