My Project
Functions/Subroutines
cell_area.f90 File Reference

Go to the source code of this file.

Functions/Subroutines

subroutine cell_area
 

Function/Subroutine Documentation

◆ cell_area()

subroutine cell_area ( )

Definition at line 52 of file cell_area.f90.

52 
53 !==============================================================================!
54  USE all_vars
55  USE mod_utils
56  USE mod_par
57  USE mod_spherical
58  IMPLICIT NONE
59  REAL(SP), ALLOCATABLE :: XX(:),YY(:)
60  REAL(SP) :: ARTMAX,ARTTOT,ARTMIN
61  REAL(SP) :: ART1MAX,ART1TOT,ART1MIN
62  INTEGER :: I,J,II,J1,J2,MAX_NBRE
63 
64  REAL(SP) :: SBUF
65  INTEGER :: IERR
66  CHARACTER(LEN=10) :: TSTR
67  CHARACTER(LEN=80) ::MSG
68 
69 !==============================================================================!
70 
71  IF (dbg_set(dbg_sbr)) WRITE(ipt,*) "START: CELL_AREA"
72 
73 !---------------INITIALIZE ARRAYS----------------------------------------------!
74 
75  art = 0.0_sp ; art1 = 0.0_sp ; art2 = 0.0_sp
76  max_nbre = maxval(ntve)+1
77  ALLOCATE(xx(2*max_nbre+1),yy(2*max_nbre+1))
78  xx = 0.0_sp ; yy = 0.0_sp
79 
80 !---------------COMPUTE AREA OF TRIANGLES USING CROSS PRODUCT------------------!
81 
82  DO i=1,nt
83  art(i) = (vx(nv(i,2)) - vx(nv(i,1))) * (vy(nv(i,3)) - vy(nv(i,1))) - &
84  (vx(nv(i,3)) - vx(nv(i,1))) * (vy(nv(i,2)) - vy(nv(i,1)))
85  END DO
86  art = abs(.5_sp*art)
87 
88 !---------------COMPUTE MESH STATISTICS----------------------------------------!
89 
90  artmin = minval(art(1:n))
91  artmax = maxval(art(1:n))
92  arttot = sum(art(1:n))
93 
94 
95  IF(artmin .LT. 1.0e-6_sp) THEN
96  msg = ""
97  IF (par) THEN
98  msg = "Proc#"
99  WRITE(tstr,'(I3)') myid
100  msg=trim(msg)//trim(tstr)//"; "
101  END IF
102 
103  msg = trim(msg)//"Min Triangle Area="
104  WRITE(tstr,'(F9.6)') artmin
105  msg=trim(msg)//trim(tstr)
106 
107  i = minloc(art(1:n),dim=1)
108 
109  msg = trim(msg)//"; EGID="
110  WRITE(tstr,'(I7)') egid(i)
111  msg=trim(msg)//trim(tstr)
112 
113  WRITE(ipt,*) "*****************************"
114  WRITE(ipt,*) trim(msg)
115  WRITE(ipt,*) "*****************************"
116  END IF
117 
118 
119 
120  IF (dbg_set(dbg_scl)) THEN
121  WRITE(ipt,*) "! Minimum Triangle Area: ", artmin
122  WRITE(ipt,*) "! Maximum Triangle Area: ", artmax
123  WRITE(ipt,*) "! Total Triangle Area : ", arttot
124  END IF
125  IF(artmin.LT. 1.0e-6_sp) CALL warning("CELL_AREA: TRIANGLE AREA IS SMALL (LT 1e-6)")
126 
127 !-------COMPUTE CONTROL VOLUME ART1: CV FOR FLUXES OF NODAL BASED VALUES-------!
128 
129  DO i=1,m
130  IF(isonb(i) == 0) THEN
131  DO j=1,ntve(i)
132  ii=nbve(i,j)
133  j1=nbvt(i,j)
134  j2=j1+1-int((j1+1)/4)*3
135  xx(2*j-1)=(vx(nv(ii,j1))+vx(nv(ii,j2)))*0.5_sp-vx(i)
136  yy(2*j-1)=(vy(nv(ii,j1))+vy(nv(ii,j2)))*0.5_sp-vy(i)
137  xx(2*j)=xc(ii)-vx(i)
138  yy(2*j)=yc(ii)-vy(i)
139  END DO
140  xx(2*ntve(i)+1)=xx(1)
141  yy(2*ntve(i)+1)=yy(1)
142 
143  DO j=1,2*ntve(i)
144  art1(i)=art1(i)+0.5_sp*(xx(j+1)*yy(j)-xx(j)*yy(j+1))
145  END DO
146  art1(i)=abs(art1(i))
147  ELSE
148  DO j=1,ntve(i)
149  ii=nbve(i,j)
150  j1=nbvt(i,j)
151  j2=j1+1-int((j1+1)/4)*3
152  xx(2*j-1)=(vx(nv(ii,j1))+vx(nv(ii,j2)))*0.5_sp-vx(i)
153  yy(2*j-1)=(vy(nv(ii,j1))+vy(nv(ii,j2)))*0.5_sp-vy(i)
154  xx(2*j)=xc(ii)-vx(i)
155  yy(2*j)=yc(ii)-vy(i)
156  END DO
157  j=ntve(i)+1
158  ii=nbve(i,j-1)
159  j1=nbvt(i,ntve(i))
160  j2=j1+2-int((j1+2)/4)*3
161  xx(2*j-1)=(vx(nv(ii,j1))+vx(nv(ii,j2)))*0.5_sp-vx(i)
162  yy(2*j-1)=(vy(nv(ii,j1))+vy(nv(ii,j2)))*0.5_sp-vy(i)
163 
164  xx(2*j)=vx(i)-vx(i)
165  yy(2*j)=vy(i)-vy(i)
166 
167  xx(2*j+1)=xx(1)
168  yy(2*j+1)=yy(1)
169 
170  DO j=1,2*ntve(i)+2
171  art1(i)=art1(i)+0.5_sp*(xx(j+1)*yy(j)-xx(j)*yy(j+1))
172  END DO
173  art1(i)=abs(art1(i))
174  END IF
175  ENDDO
176 
177 !---------------COMPUTE MESH STATISTICS----------------------------------------!
178 
179  art1min = minval(art1(1:m))
180  art1max = maxval(art1(1:m))
181  art1tot = sum(art1(1:m))
182 
183  IF(art1min .LT. 1.0e-6_sp) THEN
184  msg = ""
185  IF (par) THEN
186  msg = "Proc#"
187  WRITE(tstr,'(I3)') myid
188  msg=trim(msg)//trim(tstr)//"; "
189  END IF
190 
191  msg = trim(msg)//"Min Control Volume Area="
192  WRITE(tstr,'(F9.6)') art1min
193  msg=trim(msg)//trim(tstr)
194 
195  i = minloc(art1(1:m),dim=1)
196 
197  msg = trim(msg)//"; NGID="
198  WRITE(tstr,'(I7)') ngid(i)
199  msg=trim(msg)//trim(tstr)
200 
201  IF(isonb(i)==0) THEN
202  msg = trim(msg)//"; Node is interior"
203  ELSEIF(isonb(i)==1) THEN
204  msg = trim(msg)//"; Node is on solid boundary"
205  ELSEIF(isonb(i)==2) THEN
206  msg = trim(msg)//"; Node is on open boundary"
207  ELSE
208  msg = trim(msg)//"; ISONB has bad value!"
209  END IF
210 
211 
212  WRITE(ipt,*) "*****************************"
213  WRITE(ipt,*) trim(msg)
214  WRITE(ipt,*) "*****************************"
215  END IF
216 
217 
218 
219  IF (dbg_set(dbg_scl)) THEN
220  WRITE(ipt,*) "! Minimum Node Control Volume Area: ", art1min
221  WRITE(ipt,*) "! Maximum Node Control Volume Area: ", art1max
222  WRITE(ipt,*) "! Total Node Control Volume Area : ", art1tot
223  END IF
224  IF(art1min.LT. 1.0e-6_sp) CALL warning(" CELL_AREA: NODAL CONTROL VOLUME IS SMALL (LT 1e-6)")
225 
226 
227 
228 
229 !---COMPUTE AREA OF CONTROL VOLUME ART2(I) = SUM(ALL TRIS SURROUNDING NODE I)--!
230 
231  DO i=1,m
232  art2(i) = sum(art(nbve(i,1:ntve(i))))
233  END DO
234 
235  art(0) = art(1)
236  art1(0) = art1(1)
237  ! IF(NT > N)ART(N+1:NT) = ART(N)
238  IF(mt > m)art2(m+1:mt) = art2(m)
239  IF(mt > m)art1(m+1:mt) = art1(m)
240  DEALLOCATE(xx,yy)
241 
242  ! NOTES: SHOULD MAKE AN ARRAY TO STORE 1/ART, 1/ART2 and 1/ART2
243  ! IT is faster and safer
244 
245  IF (dbg_set(dbg_log)) WRITE(ipt,*) "! CELL AREA : COMPLETE"
246 
247  IF (dbg_set(dbg_sbr)) WRITE(ipt,*) "END: CELL_AREA"
248  RETURN
real(sp), dimension(:), allocatable, target art
Definition: mod_main.f90:1009
integer, parameter dbg_scl
Definition: mod_utils.f90:67
logical function dbg_set(vrb)
Definition: mod_utils.f90:182
real(sp), dimension(:), allocatable, target art1
Definition: mod_main.f90:1010
real(sp), dimension(:), allocatable, target yc
Definition: mod_main.f90:1004
real(sp), dimension(:), allocatable, target art2
Definition: mod_main.f90:1011
integer, dimension(:,:), allocatable, target nbvt
Definition: mod_main.f90:1036
real(sp), dimension(:), allocatable, target vx
Definition: mod_main.f90:1001
real(sp), dimension(:), allocatable, target vy
Definition: mod_main.f90:1002
integer, dimension(:), allocatable, target ntve
Definition: mod_main.f90:1022
subroutine warning(ER1, ER2, ER3, ER4)
Definition: mod_utils.f90:251
integer, dimension(:,:), allocatable, target nv
Definition: mod_main.f90:1018
integer, dimension(:,:), allocatable, target nbve
Definition: mod_main.f90:1034
real(sp), dimension(:), allocatable, target xc
Definition: mod_main.f90:1003
integer, dimension(:), pointer ngid
Definition: mod_par.f90:61
integer, parameter dbg_sbr
Definition: mod_utils.f90:69
integer, dimension(:), allocatable, target isonb
Definition: mod_main.f90:1024
integer, dimension(:), pointer egid
Definition: mod_par.f90:60
integer, parameter dbg_log
Definition: mod_utils.f90:65
Here is the call graph for this function:
Here is the caller graph for this function: