47
48
49
50
51
52
53
54
55
56
57
60 USE elbufdef_mod
62 USE multi_fvm_mod
63 USE multimat_param_mod , ONLY : m51_n0phas, m51_nvphas
64 USE matparam_def_mod, ONLY : matparam_struct_
65 use element_mod , only : nixs,nixq,nixtg
66
67
68
69#include "implicit_f.inc"
70
71
72
73#include "com01_c.inc"
74#include "com04_c.inc"
75#include "com08_c.inc"
76#include "param_c.inc"
77#include "scr03_c.inc"
78#include "scr17_c.inc"
79#include "task_c.inc"
80#include "units_c.inc"
81#include "chara_c.inc"
82
83
84
85 INTEGER,INTENT(IN) :: ITAB(NUMNOD), IPART(LIPART1,*),IGEO(NPROPGI,NUMGEO), IXS(NIXS,NUMELS), IPART_STATE(NPART)
86
87INTEGER, INTENT(INOUT) :: NODTAG(NUMNOD), IPM(NPROPMI,*)
88 INTEGER, TARGET :: IPARTS(*),IPARTQ(*),IPARTTG(*)
89 my_real,
INTENT(IN) :: x(3,numnod),v(3,numnod)
90 my_real,
INTENT(IN),
TARGET :: bufmat(*)
91 TYPE (ELBUF_STRUCT_), DIMENSION(NGROUP), TARGET, INTENT(IN) :: ELBUF_TAB
92 TYPE(MULTI_FVM_STRUCT), INTENT(IN) :: MULTI_FVM
93 TYPE(MATPARAM_STRUCT_) ,DIMENSION(NUMMAT) ,INTENT(IN) :: MAT_PARAM
94
95
96
97 INTEGER I, N, JJ, J, IPRT, K, KK, INOD
98 INTEGER NG, NEL, NFT, LFT, LLT, ITY, ISOLNOD, NPT
99 INTEGER NUM_CENTROIDS, IPOS, MLW, NBMAT, NB2, ISUBMAT, NNOD
100 INTEGER NUVAR
101 TYPE(G_BUFEL_) ,POINTER :: GBUF
102 my_real min_x,min_y,min_z,max_x,max_y,max_z,p0(3),p0_inf(3),p0_sup(3),length
107 my_real dotprod,tol,xyz(3),vel(3),dist,vect(3)
108 CHARACTER FILNAM*100, *4
109 INTEGER XMIN_CELL_ID,YMIN_CELL_ID,ZMIN_CELL_ID,XMAX_CELL_ID,YMAX_CELL_ID,ZMAX_CELL_ID
110 INTEGER IS_ITY_1, IS_ITY_2, IS_ITY_7, IMAT, NPAR, IADBUF
111 INTEGER, POINTER,DIMENSION(:) :: IPART_PTR
112 my_real,
POINTER,
DIMENSION(:) :: uparam
113 TYPE(BUF_MAT_) ,POINTER :: MBUF
114 INTEGER, ALLOCATABLE, DIMENSION(:,:) :: GET_CELL_FOM_CENTROID
115 INTEGER NPTS(NSPMD),NCELL(NSPMD),NPTS_TOT,NCELL_TOT
116 my_real,
DIMENSION(:,:),
ALLOCATABLE :: work
118 my_real :: shift_cy_min, shift_ny_min, shift_cz_min, shift_nz_min
119 INTEGER, ALLOCATABLE, DIMENSION(:) :: IDX, NODTAG_G
120 INTEGER :: CELL_ID,IDX1(21),IDX2(21),IDX3(21)
121
122
123
124
125
126 IF(n2d == 0)THEN
127
129 IF(ispmd == 0)THEN
130 CALL ancmsg(msgid=288,anmode=aninfo)
132 ENDIF
133 ENDIF
134 RETURN
135 ENDIF
136
137
138
139
140
141
142
144 num_centroids = 0
145 mlw=0
146
147 min_x = ep20
148 min_y = ep20
149 min_z = ep20
150 max_x = -ep20
151 max_y = -ep20
152 max_z = -ep20
153
154 is_ity_1 = 0
155 is_ity_2 = 0
156 is_ity_7 = 0
157
158
159
161 IF(ispmd/=0)THEN
163 ELSE
165 ENDIF
166 ENDIF
167
168
169
170 DO ng=1,ngroup
171 ity =iparg(5,ng)
172 isolnod = iparg(28,ng)
173 nel =iparg(2,ng)
174 nft =iparg(3,ng)
175 gbuf => elbuf_tab(ng)%GBUF
176 mlw = iparg(1,ng)
177 lft=1
178 llt=nel
179 npt=0
180 IF(ity == 1) THEN
181
182 is_ity_1=1
183 npt=isolnod
184 ipart_ptr => iparts(1:numels)
185 ELSEIF(ity == 2)THEN
186
187 is_ity_2=1
188 npt=4
189 ipart_ptr => ipartq(1:numelq)
190 ELSEIF(ity == 7 .AND. n2d /= 0)THEN
191
192 is_ity_7=1
193 npt=3
194 ipart_ptr => iparttg(1:numeltg)
195 ENDIF
196 IF(npt /= 0)THEN
197 DO i=lft,llt
198 n = i + nft
199 iprt=ipart_ptr(n)
200 imat =ipart(1,iprt)
201 IF(ipart_state(iprt)==0)cycle
202 num_centroids = num_centroids +1
203 DO k=1,npt
204 IF(is_ity_1==1)inod=ixs(1+k,n)
205 IF(is_ity_2==1)inod=ixq(1+k,n)
206 IF(is_ity_7==1)inod=ixtg(1+k,n)
207 IF(is_ity_1==1)nodtag(ixs(1+k,n)) = 1
208 IF(is_ity_2==1)nodtag(ixq(1+k,n)) = 1
209 IF(is_ity_7==1)nodtag(ixtg(1+k,n)) = 1
210 IF(x(1,inod)<min_x)THEN
211 min_x=x(1,inod)
212 xmin_cell_id = n
213 ENDIF
214 IF(x(2,inod)<min_y)THEN
215 min_y=x(2,inod)
216 ymin_cell_id = n
217 ENDIF
218 IF(x(3,inod)<min_z)THEN
219 min_z=x(3,inod)
220 zmin_cell_id = n
221 ENDIF
222 IF(x(1,inod)>max_x)THEN
223 max_x=x(1,inod)
224 xmax_cell_id = n
225 ENDIF
226 IF(x(2,inod)>max_y)THEN
227 max_y=x(2,inod)
228 ymax_cell_id = n
229 ENDIF
230 IF(x(3,inod)>max_z)THEN
231 max_z=x(3,inod)
232 zmax_cell_id = n
233 ENDIF
234 ENDDO
235 END DO
236 ELSE
237
238 END IF
239 END do
240
241
242
245
246 nnod=0
247 DO i=1,numnod
248 IF(nodtag(i) == 1)THEN
249 nnod=nnod+1
250 ENDIF
251 ENDDO
252
253
254
258 IF(.NOT.ALLOCATED(get_cell_fom_centroid))THEN
259 ALLOCATE(get_cell_fom_centroid(2,num_centroids))
260 ENDIF
261
262 lx=zero
263 ly=zero
264 lz=zero
265 IF(num_centroids > 0)THEN
266
267
268 lx=max_x-min_x
269 ly=max_y-min_y
270 lz=max_z-min_z
271 vect(1:3)=(/lx,ly,lz/)
272 length = sqrt(vect(2)*vect(2) + vect(3)*vect(3))
273 IF(is_ity_1==1)THEN
274 p0_inf(2) = sum( x(2,ixs(2:9,ymin_cell_id)) ) / npt
275 p0_inf(3) = sum( x(3,ixs(2:9,zmin_cell_id)) ) / npt
276 ELSEIF(is_ity_2==1)THEN
277 p0_inf(2) = sum( x(2,ixq(2:5,ymin_cell_id)) ) / npt
278 p0_inf(3) = sum( x(3,ixq(2:5,zmin_cell_id)) ) / npt
279 ELSEIF(is_ity_7==1)THEN
280 p0_inf(2) = sum( x(2,ixtg(2:4,ymin_cell_id)) ) / npt
281 p0_inf(3) = sum( x(3,ixtg(2:4,zmin_cell_id)) ) / npt
282 ENDIF
283 shift_cy = p0_inf(2)
284 shift_cz = p0_inf(3)
288 ELSE
292 ENDIF
293
294
295
296
297
298
299 shift_ny=min_y
300 shift_nz=min_z
303
304
305
306 ALLOCATE(work(num_centroids,3))
307 k=1
308 DO ng=1,ngroup
309 ity =iparg(5,ng)
310 isolnod = iparg(28,ng)
311 nel =iparg(2,ng)
312 nft =iparg(3,ng)
313 gbuf => elbuf_tab(ng)%GBUF
314 mlw = iparg(1,ng)
315 lft=1
316 llt=nel
317 IF(npt /= 0)THEN
318 DO i=lft,llt
319 n = i + nft
320 iprt=ipart_ptr(n)
321 IF(ipart_state(iprt)==0)cycle
322
323 IF(is_ity_1==1)THEN
324 p0(2) = sum( x(2,ixs(2:9,n)) ) / npt
325 p0(3) = sum( x(3,ixs(2:9,n)) ) / npt
326 cell_id = ixs(nixs,n)
327 ELSEIF(is_ity_2==1)THEN
328 p0(2) = sum( x(2,ixq(2:5,n)) ) / npt
329 p0(3) = sum( x(3,ixq(2:5,n)) ) / npt
330 cell_id = ixq(nixq,n)
331 ELSEIF(is_ity_7==1)THEN
332 p0(2) = sum( x(2,ixtg(2:4,n)) ) / npt
333 p0(3) = sum( x(3,ixtg(2:4,n)) ) / npt
334 cell_id = ixtg(nixtg,n)
335 ENDIF
336
337
338
339 work(k,1) = p0(2)
340 work(k,2) = p0(3)
341 work(k,3) = cell_id
342 get_cell_fom_centroid(1,k) = ng
343 get_cell_fom_centroid(2,k) = i
344 k=k+1
345 END DO
346 END IF
347 END do
348
349
350
351 IF(.NOT.ALLOCATED(idx))ALLOCATE(idx(num_centroids))
352 DO k=1,num_centroids ; idx(k)=k; ENDDO
353 IF(num_centroids>0)
CALL quicksort(work(:,3), idx, 1, num_centroids)
354
355 DO k=1,num_centroids
359 ENDDO
360 IF(ALLOCATED(work))DEALLOCATE(work)
361
362
363
364
365
366 IF(num_centroids > 0)THEN
367 IF(mlw==151)THEN
368 nbmat = multi_fvm%NBMAT
369 ELSEIF(mlw==51)THEN
370 nbmat = 4
371 ELSE
372 nbmat = 1
373 ENDIF
377 DO i=1,nbmat
382 ENDDO
383 IF(mlw==151)THEN
384
391
392 DO k=1, num_centroids
393 ng = get_cell_fom_centroid(1,idx(k))
394 i = get_cell_fom_centroid(2,idx(k))
395 nft = iparg(3,ng)
401 ENDDO
402
403 DO isubmat=1,nbmat
404 DO k=1, num_centroids
405 ng = get_cell_fom_centroid(1,idx(k))
406 i = get_cell_fom_centroid(2,idx(k))
407 nft = iparg(3,ng)
408 state_inimap_buf(1)%SUBMAT(isubmat)%VFRAC(k) = multi_fvm%PHASE_ALPHA(isubmat,i+nft)
409 state_inimap_buf(1)%SUBMAT(isubmat)%RHO(k) = multi_fvm%PHASE_RHO(isubmat,i+nft)
410 state_inimap_buf(1)%SUBMAT(isubmat)%E(k) = multi_fvm%PHASE_EINT(isubmat,i+nft)
412 ENDDO
413 ENDDO
414 ELSEIF(mlw==51)THEN
415 nb2=0
416 DO isubmat=1,nbmat
417 DO k=1, num_centroids
418 ng = get_cell_fom_centroid(1,idx(k))
419 i = get_cell_fom_centroid(2,idx(k))
420 nft = iparg(3,ng)
421 nel = iparg(2,ng)
422 n = i + nft
423 iprt=ipart_ptr(n)
424 imat =ipart(1,iprt)
425 IF(mat_param(imat)%MULTIMAT%MID(isubmat) == 0)EXIT
426 nb2=
max(nb2,ipm(5,imat))
427 iadbuf = ipm(7,imat)
428 npar = ipm(9,imat)
429 nuvar = ipm(8,imat)
430 uparam => bufmat(iadbuf:iadbuf+npar-1)
431 kk = m51_n0phas + (uparam(276+isubmat)-1)*m51_nvphas
432 mbuf => elbuf_tab(ng)%BUFLY(1)%MAT(1,1,1)
437 ENDDO
438 ENDDO
440 ELSE
441 DO k=1, num_centroids
442 ng = get_cell_fom_centroid(1,idx(k))
443 i = get_cell_fom_centroid(2,idx(k))
444 gbuf => elbuf_tab(ng)%GBUF
445 nel =iparg(2,ng)
449 state_inimap_buf(1)%SUBMAT(1)%PRES(k) = -third * (gbuf%SIG(i) + gbuf%SIG(i + nel) + gbuf%SIG(i + 2 * nel))
450 ENDDO
451 ENDIF
452 ENDIF
453
454
455
456 IF(num_centroids > 0)THEN
457 IF(mlw /= 151)THEN
458 ALLOCATE(work(numnod,4))
459
465 nnod=0
466 DO i=1,numnod
467 IF(nodtag(i) == 1)THEN
468 nnod=nnod+1
469
470
471
472
473 work(nnod,1) = x(2,i)
474 work(nnod,2) = x(3,i)
475 work(nnod,3) = v(2,i)
476 work(nnod,4) = v(3,i)
478 ENDIF
479 ENDDO
481
482 IF(ALLOCATED(idx))DEALLOCATE(idx)
483 IF(.NOT.ALLOCATED(idx))ALLOCATE(idx(nnod))
484 DO k=1,nnod ; idx(k)=k; ENDDO
486 DO k=1,nnod
491 ENDDO
492 IF(ALLOCATED(work))DEALLOCATE(work)
493
494
495 ELSE
496
497
498 ENDIF
499 ENDIF
500
501
502
503
504 IF(nspmd > 1)THEN
507
508 IF(ispmd == 0)THEN
513 DO i=2,nspmd
519 ENDDO
524 ENDIF
525 ENDIF
526
527
528
529
532 IF(ispmd == 0 .AND. nspmd > 1)THEN
533
534
535 npts_tot = 0
536 ncell_tot = 0
537 len_tot = zero
538 DO i=1,nspmd
540 npts(i)=0
541 len_(i)=zero
542 ncell(i)=0
543 cycle
544 ENDIF
546 npts_tot=npts_tot+npts(i)
548 len_tot=len_tot+len_(i)
550 ncell_tot = ncell_tot + ncell(i)
551 ENDDO
552 ALLOCATE(work(npts_tot,5))
553
554
555
556 j=0
557 DO i=1,nspmd
558 DO k=1,npts(i)
559 j=j+1
565 ENDDO
566 ENDDO
567
568
569 IF(ALLOCATED(idx))DEALLOCATE(idx)
570 IF(.NOT.ALLOCATED(idx))ALLOCATE(idx(npts_tot))
571 DO k=1,npts_tot ; idx(k)=k; ENDDO
572 CALL quicksort(work(:,5), idx, 1, npts_tot)
573
574
575
576
577
578 IF(mlw /= 151)THEN
579 ALLOCATE(nodtag_g(npts_tot))
580 nodtag_g(1:npts_tot)=1
581 k=0
582 DO j=2,npts_tot
583 IF(work(j,5) == work(j-1,5))THEN
584 nodtag_g(j)=0
585 k=k+1
586 ENDIF
587 ENDDO
588 ELSE
589 k=npts_tot
590 ENDIF
591
592
593
603 j=0
604 DO k=1,npts_tot
605 IF(mlw /= 151)THEN
606 IF(nodtag_g(k)==0)cycle
607 ENDIF
608 j=j+1
614 ENDDO
615 npts_tot = j
617 IF(ALLOCATED(work))DEALLOCATE(work)
618 IF(ALLOCATED(nodtag_g))DEALLOCATE(nodtag_g)
619
620 nbmat=1
621 DO i=1,nspmd
623 ENDDO
624 ALLOCATE(work(ncell_tot,3+4*nbmat))
625
626
627
628 j=0
629 DO i=1,nspmd
630 DO k=1,ncell(i)
631 j=j+1
636 DO jj=1,nbmat
641 ENDDO
642 ENDDO
643 ENDDO
644
645
646
651 DO jj=1,nbmat
656 ENDDO
660 DO jj=1,nbmat
665 ENDDO
666
667 IF(ALLOCATED(idx))DEALLOCATE(idx)
668 IF(.NOT.ALLOCATED(idx))ALLOCATE(idx(ncell_tot))
669 DO k=1,ncell_tot ; idx(k)=k; ENDDO
670 CALL quicksort(work(:,3), idx, 1, ncell_tot)
671
672 DO j=1,ncell_tot
677 DO jj=1,nbmat
682 ENDDO
683 ENDDO
686
687 endif
688
689 IF(ispmd == 0)THEN
690 IF(ncell_tot == 0 .OR. len_tot == zero)THEN
691 CALL ancmsg(msgid=284,anmode=aninfo,c1=
" -- 2D DOMAIN IS NOT DETECTED : CHECK X-PROJECTION")
692 return
693 ELSEIF(len_tot > 0 .AND. ncell_tot > 0)THEN
694 IF(lx/len_tot > em06)THEN
695 CALL ancmsg(msgid=284,anmode=aninfo,c1=
" -- 2D DOMAIN IS NOT DETECTED.")
696 return
697 ENDIF
698 ENDIF
699 ENDIF
700
701
702
703
704
705
706
707 IF(ispmd == 0)THEN
709 filnam=rootnam(1:rootlen)//'_2D_'//chstat//'.inimap'
710 OPEN(unit=220582,file=filnam(1:len(trim(filnam))),access='SEQUENTIAL',form='FORMATTED',status='UNKNOWN')
712 WRITE(unit=220582,fmt='(A,A)') '# ROOTNAME = ',rootnam(1:rootlen)
713 WRITE(unit=220582,fmt='(A,I0)') '# VERSION = ',st_invers
714 WRITE(unit=220582,fmt='(A,F20.13)')'# TIME = ',tt
715 WRITE(unit=220582,fmt='(A,I10)') '# NCYCLE = ',ncycle
716 WRITE(unit=220582,fmt='(A,I10)') '# NCELL = ',ncell_tot
717
718
719
720
721 ENDIF
722
723 IF(ispmd == 0)THEN
724
731
732 ipos=0
733 DO isubmat = 1,nbmat
734 WRITE(unit=220582,fmt=2001)ipos+isubmat,isubmat
735 DO k=1, num_centroids
739 ENDDO
740
741 ENDDO
742
743 ipos=100
744 DO isubmat = 1,nbmat
745 WRITE(unit=220582,fmt=2002)ipos+isubmat,isubmat
746 DO k=1, num_centroids
750 ENDDO
751
752 ENDDO
753
754 ipos=200
755 DO isubmat = 1,nbmat
756 WRITE(unit=220582,fmt=2003)ipos+isubmat,isubmat
757 DO k=1, num_centroids
761 ENDDO
762
763 ENDDO
764
765 ipos=300
766 DO isubmat = 1,nbmat
767 WRITE(unit=220582,fmt=2004)ipos+isubmat,isubmat
768 DO k=1, num_centroids
772 ENDDO
773
774 ENDDO
775
776
777 WRITE(unit=220582,fmt=3000)
779 WRITE(unit=220582,fmt='(4E20.12,I10)')
782 ENDDO
783
784 ENDIF
785
786
787
788
789 IF(ispmd == 0)THEN
790
791 IF(ALLOCATED(get_cell_fom_centroid))DEALLOCATE(get_cell_fom_centroid)
792 DO jj=1,nspmd
795 DO i=1,nbmat
799 ENDDO
800 ENDIF
810 ENDDO
811
812
813 WRITE(unit=220582,fmt=1000)
814
815
816
817 idx1=(/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21/)
818 idx2=100+idx1
819 idx3=300+idx1
821 WRITE(unit=220582,fmt='(A)') '#/INIMAP2D/VP/1'
822 ELSE
823 WRITE(unit=220582,fmt='(A)') '#/INIMAP2D/VE/1'
824 ENDIF
825 WRITE(unit=220582,fmt='(A)') '#default input to update from /STATE/INIMAP2D'
826 WRITE(unit=220582,fmt='(A)') '## Node1 Node2 Node3'
827 WRITE(unit=220582,fmt='(A)') '# 0 0 0'
828 WRITE(unit=220582,fmt='(A)') '## Grbric Grquad Grtria'
829 WRITE(unit=220582,fmt='(A)') '# 0 0 0'
830 WRITE(unit=220582,fmt='(A)') '## Fct_v Fscale_v'
831 WRITE(unit=220582,fmt='(A)') '# 400 1.0'
832 DO imat=1,
min(21,nbmat)
833 WRITE(unit=220582,fmt='(a)') '## Fct_vf Fct_rho Fscale_rho Fct_p Fscale_p'
834 WRITE(unit=220582,fmt='(A1,I10,2(I10,F20.0))')'#', idx1(imat),idx2(imat),1.0,idx3(imat),1.0
835 ENDDO
836 WRITE(unit=220582,fmt=1000)
837
838 WRITE (iout,500) filnam(1:len(trim(filnam)))
839 WRITE (istdo,500) filnam(1:len(trim(filnam)))
840
841 CLOSE(unit=220582)
842
843 ENDIF
844
846
847
848
849
850
851
852
853
854
855 500 FORMAT (4x,' STATE FILE:',1x,a,' WRITTEN')
856
857 1000 FORMAT('#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|')
858
859 2001 FORMAT('#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|',/,
860 . '/FUNC_2D/',i0,/,
861 . 'volume fraction submaterial_',i0,/,
862 . ' 1',/,
863 . '#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|')
864 2002 FORMAT('#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|',/,
865 . '/FUNC_2D/',i0,/,
866 . 'mass density submaterial_',i0,/,
867 . ' 1',/,
868 . '#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|'
869 2003 FORMAT('#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|',/,
870 . '/FUNC_2D/',i0,/,
871 . 'energy density submaterial_',i0,/,
872 . ' 1',/,
873 . '#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|')
874 2004 FORMAT('#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|',/,
875 . '/FUNC_2D/',i0,/,
876 . 'pressure submaterial_',i0,/,
877 . ' 1',/,
878 . '#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|')
879
880 3000 FORMAT('#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|'
881 . '/FUNC_2D/400',/,
882 . 'velocity_function'/,
883 . ' 2',/,
884 . '#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|')
885
886 RETURN
logical is_stat_inimap_vp
integer state_inimap_call_number
type(map_struct), dimension(:), allocatable state_inimap_buf
logical is_stat_inimap_msg_already_displayed
recursive subroutine quicksort_i2(a, idx, first, last)
recursive subroutine quicksort(a, idx, first, last)
subroutine spmd_state_inimap2d_exch_data()
subroutine spmd_state_inimap_exch_siz()
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)