1 | include(dom.inc)
2 |
3 | RECURSIVE FUNCTION compare(patch, i, patchesofthisnode, &
4 | & nodepatch, nvert) RESULT(somme)
5 |
6 | ! ==================================================================!
7 | ! !
8 | ! compare.F : This function makes a recursive comparison to check !
9 | ! if one value is repeated in all the given vectors. !
10 | ! In PRISSMA it is used to detect wich is the common !
11 | ! patch of all the nodes in a boundary face. !
12 | ! !
13 | ! in : The 'patch' to be tested !
14 | ! The node 'i' !
15 | ! The nb of patches for each node 'patchesofthisnode' !
16 | ! The list of patches for each node 'nodepatch' !
17 | ! The total number of nodes 'nvert' of the face !
18 | ! !
19 | ! out : 'somme' with zero if no common patch, and patch if !
20 | ! the comparison has reached correctly the las node !
21 | ! !
22 | ! author : J. Amaya (december 2007) !
23 | ! !
24 | ! ==================================================================!
25 |
26 | IMPLICIT NONE
27 |
28 | ! IN
29 | DOM_INT :: patch, nvert, i
30 | DOM_INT, DIMENSION(nvert) :: patchesofthisnode
31 | DOM_INT, DIMENSION(nvert,3) :: nodepatch
32 |
33 | ! OUT
34 | DOM_INT :: somme
35 |
36 | ! LOCAL
37 | DOM_INT :: j
38 |
39 | somme = 0
40 |
41 | ! print*, " --cmp--patchesofthisnode ",i,":", patchesofthisnode(i)
42 | DO j = 1, patchesofthisnode(i)
43 | IF (somme.eq.0) THEN
44 | ! print*, " --cmp--nodepatch ",i,j,":",nodepatch(i,j)
45 | IF(nodepatch(i,j).eq.patch) THEN
46 | IF(nodepatch(i,j).eq.patch) THEN
47 | IF (i.eq.nvert) THEN
48 | somme = patch
49 | ELSE
50 | ! print*, " --cmp-to ", i+1, j
51 | somme = somme + compare(nodepatch(i,j), i+1, &
52 | & patchesofthisnode, nodepatch, nvert)
53 | ! print*, " --cmp-update to line ", i
54 | ! print*, " --cmp-update next in list ", j+1
55 | ENDIF
56 | ENDIF
57 | ENDIF
58 | ENDIF
59 | ENDDO
60 | ! print*, " --cmp-----done line ",i
61 |
62 | ! ==================================================================!
63 | !
64 | ! -- Ancient version:
65 | ! -- this version helps to better understand
66 | ! -- how the function works
67 | ! -- IF somme=0 is needed in order to sum only one time the patch
68 | !
69 | ! IF (i.eq.nvert) THEN
70 | !
71 | ! DO j = 1, patchesofthisnode(i)
72 | ! IF(nodepatch(i,j).eq.patch) somme = patch
73 | ! ENDDO
74 | !
75 | ! ELSE
76 | !
77 | ! DO j = 1, patchesofthisnode(i)
78 | ! IF(nodepatch(i,j).eq.patch) THEN
79 | ! somme = somme + compare(nodepatch(i,j), i+1, &
80 | ! & patchesofthisnode, nodepatch, nvert)
81 | ! ENDIF
82 | ! ENDDO
83 | !
84 | ! ENDIF
85 | !
86 | ! ==================================================================!
87 |
88 | END FUNCTION compare
compare.F could be called by: