46
47
48
49
50
51
52
53
54
55
56
59 USE elbufdef_mod
61 USE multi_fvm_mod
62 USE multimat_param_mod , ONLY : m51_n0phas, m51_nvphas
63 USE matparam_def_mod, ONLY : matparam_struct_
64
65
66
67#include "implicit_f.inc"
68
69
70
71#include "com01_c.inc"
72#include "com04_c.inc"
73#include "com08_c.inc"
74#include "param_c.inc"
75#include "scr03_c.inc"
76#include "scr17_c.inc"
77#include "task_c.inc"
78#include "units_c.inc"
79#include "chara_c.inc"
80
81
82
83 INTEGER,INTENT(IN) :: ITAB(NUMNOD), (LIPART1,*),IGEO(NPROPGI,NUMGEO), IXS(NIXS,NUMELS), IPART_STATE(NPART),
84 . IPARG(NPARG,*),IXQ(NIXQ,NUMELQ),IXTG(NIXTG,NUMELTG)
85 INTEGER, INTENT(INOUT) :: NODTAG(NUMNOD), IPM(,*)
86 INTEGER, TARGET :: IPARTS(*),IPARTQ(*),IPARTTG(*)
87 my_real,
INTENT(IN) :: x(3,numnod),v(3,numnod)
88 my_real,
INTENT(IN),
TARGET :: bufmat(*)
89 TYPE (ELBUF_STRUCT_), DIMENSION(NGROUP), TARGET, INTENT(IN) :: ELBUF_TAB
90 TYPE(MULTI_FVM_STRUCT), INTENT(IN) :: MULTI_FVM
91 TYPE(MATPARAM_STRUCT_) ,DIMENSION(NUMMAT) ,INTENT(IN) :: MAT_PARAM
92
93
94
95 INTEGER I, N, JJ,J, IPRT0, IPRT, K, STAT_NUMELS_1, KK, INOD
96 INTEGER NG, NEL, NFT, LFT, LLT, ITY, ISOLNOD, IOFF,NPT
97 INTEGER NUM_CENTROIDS, IPOS,MLW,IFORM,NBMAT,NB2,ISUBMAT,NNOD,NNOD2
98 INTEGER NUVAR
99 TYPE(G_BUFEL_) ,POINTER :: GBUF
100 my_real min_x,min_y,min_z,max_x,max_y,max_z,p0(3),p0_inf(3),p0_sup(3),length
105 my_real dotprod,tol,xyz(3),vel(3),dist,vect(3)
106 CHARACTER FILNAM*100, CHSTAT*4
107 INTEGER XMIN_CELL_ID,YMIN_CELL_ID,ZMIN_CELL_ID,XMAX_CELL_ID,YMAX_CELL_ID,ZMAX_CELL_ID
108 INTEGER , IS_ITY_2, IS_ITY_7, LAST_CELL,FIRST_CELL,IMAT,NPAR,IADBUF
109 INTEGER, POINTER,DIMENSION(:) :: IPART_PTR
110 my_real,
POINTER,
DIMENSION(:) :: uparam
111 TYPE(BUF_MAT_) ,POINTER :: MBUF
112 INTEGER, ALLOCATABLE, DIMENSION(:,:) :: GET_CELL_FOM_CENTROID
113 INTEGER NPTS(NSPMD),NCELL(NSPMD),NPTS_TOT,NCELL_TOT
114 my_real,
DIMENSION(:,:),
ALLOCATABLE :: work
116 my_real :: shift_cy_min, shift_ny_min, shift_cz_min, shift_nz_min
117 INTEGER, ALLOCATABLE, DIMENSION(:) :: IDX, NODTAG_G
118 INTEGER :: CELL_ID,IDX1(21),IDX2(21),IDX3(21)
119
120
121
122
123
124 IF(n2d == 0)THEN
125
127 IF(ispmd == 0)THEN
128 CALL ancmsg(msgid=288,anmode=aninfo)
130 ENDIF
131 ENDIF
132 RETURN
133 ENDIF
134
135
136
137
138
139
140
142 num_centroids = 0
143 mlw=0
144
145 min_x = ep20
146 min_y = ep20
147 min_z = ep20
148 max_x = -ep20
149 max_y = -ep20
150 max_z = -ep20
151
152 is_ity_1 = 0
153 is_ity_2 = 0
154 is_ity_7 = 0
155
156
157
159 IF(ispmd/=0)THEN
161 ELSE
163 ENDIF
164 ENDIF
165
166
167
168 DO ng=1,ngroup
169 ity =iparg(5,ng)
170 isolnod = iparg(28,ng)
171 nel =iparg(2,ng)
172 nft =iparg(3,ng)
173 gbuf => elbuf_tab(ng)%GBUF
174 mlw = iparg(1,ng)
175 lft=1
176 llt=nel
177 npt=0
178 IF(ity == 1) THEN
179
180 is_ity_1=1
181 npt=isolnod
182 ipart_ptr => iparts(1:numels)
183 ELSEIF(ity == 2)THEN
184
185 is_ity_2=1
186 npt=4
187 ipart_ptr => ipartq(1:numelq)
188 ELSEIF(ity == 7 .AND. n2d /= 0)THEN
189
190 is_ity_7=1
191 npt=3
192 ipart_ptr => iparttg(1:numeltg)
193 ENDIF
194 IF(npt /= 0)THEN
195 DO i=lft,llt
196 n = i + nft
197 iprt=ipart_ptr(n)
198 imat =ipart(1,iprt)
199 IF(ipart_state(iprt)==0)cycle
200 num_centroids = num_centroids +1
201 DO k=1,npt
202 IF(is_ity_1==1)inod=ixs(1+k,n)
203 IF(is_ity_2=
204 IF(is_ity_7==1)inod=ixtg(1+k,n)
205 IF(is_ity_1==1)nodtag(ixs(1+k,n)) = 1
206 IF(is_ity_2==1)nodtag(ixq
207 IF(is_ity_7==1)nodtag(ixtg(1+k,n)) = 1
208 IF(x(1,inod)<min_x)THEN
209 min_x=x(1,inod)
210 xmin_cell_id = n
211 ENDIF
212 IF(x(2,inod)<min_y)THEN
213 min_y=x(2,inod)
214 ymin_cell_id = n
215 ENDIF
216 IF(x(3,inod)<min_z)THEN
217 min_z=x(3,inod)
218 zmin_cell_id = n
219 ENDIF
220 IF(x(1,inod)>max_x)THEN
221 max_x=x(1,inod)
222 xmax_cell_id = n
223 ENDIF
224 IF(x(2,inod)>max_y)THEN
225 max_y=x(2,inod)
226 ymax_cell_id = n
227 ENDIF
228 IF(x(3,inod)>max_z)THEN
229 max_z=x(3,inod)
230 zmax_cell_id = n
231 ENDIF
232 ENDDO
233 END DO
234 ELSE
235
236 END IF
237 END do
238
239
240
243
244 nnod=0
245 DO i=1,numnod
246 IF(nodtag(i) == 1)THEN
247 nnod=nnod+1
248 ENDIF
249 ENDDO
250
251
252
256 IF(.NOT.ALLOCATED(get_cell_fom_centroid))THEN
257 ALLOCATE(get_cell_fom_centroid(2,num_centroids))
258 ENDIF
259
260 lx=zero
261 ly=zero
262 lz=zero
263 IF(num_centroids > 0)THEN
264
265
266
267 ly=max_y-min_y
268 lz=max_z-min_z
269 vect(1:3)=(/lx,ly,lz/)
270 length = sqrt(vect(2)*vect(2) + vect(3)*vect(3))
271 IF(is_ity_1==1)THEN
272 p0_inf(2) = sum( x(2,ixs(2:9,ymin_cell_id)) ) / npt
273 p0_inf(3) = sum( x(3,ixs(2:9,zmin_cell_id)) ) / npt
274 ELSEIF(is_ity_2==1)THEN
275 p0_inf(2) = sum( x(2,ixq(2:5,ymin_cell_id)) ) / npt
276 p0_inf(3) = sum( x(3,ixq(2:5,zmin_cell_id)) ) / npt
277 ELSEIF(is_ity_7==1)THEN
278 p0_inf(2) = sum( x(2,ixtg(2:4,ymin_cell_id)) ) / npt
279 p0_inf(3) = sum( x(3,ixtg(2:4,zmin_cell_id)) ) / npt
280 ENDIF
281 shift_cy = p0_inf(2)
282 shift_cz = p0_inf(3)
286 ELSE
290 ENDIF
291
292
293
294
295
296
297 shift_ny=min_y
298 shift_nz=min_z
301
302
303
304 ALLOCATE(work(num_centroids,3))
305 k=1
306 DO ng=1,ngroup
307 ity =iparg(5,ng)
308 isolnod = iparg(28,ng)
309 nel =iparg(2,ng)
310 nft =iparg(3,ng)
311 gbuf => elbuf_tab(ng)%GBUF
312 mlw = iparg(1,ng)
313 lft=1
314 llt=nel
315 IF(npt /= 0)THEN
316 DO i=lft,llt
317 n = i + nft
318 iprt=ipart_ptr(n)
319 IF(ipart_state(iprt)==0)cycle
320
321 IF(is_ity_1==1)THEN
322 p0(2) = sum( x(2,ixs(2:9,n)) ) / npt
323 p0(3) = sum( x(3,ixs(2:9,n)) ) / npt
324 cell_id = ixs(nixs,n)
325 ELSEIF(is_ity_2==1)THEN
326 p0(2) = sum( x(2,ixq(2:5,n)) ) / npt
327 p0(3) = sum( x(3,ixq(2:5,n)) ) / npt
328 cell_id = ixq(nixq,n)
329 ELSEIF(is_ity_7==1)THEN
330 p0(2) = sum( x(2,ixtg(2:4,n)) ) / npt
331 p0(3) = sum( x(3,ixtg(2:4,n)) ) / npt
332 cell_id = ixtg(nixtg,n)
333 ENDIF
334
335
336
337 work(k,1) = p0(2)
338 work(k,2) = p0(3)
339 work(k,3) = cell_id
340 get_cell_fom_centroid(1,k) = ng
341 get_cell_fom_centroid(2,k) = i
342 k=k+1
343 END DO
344 END IF
345 END do
346
347
348
349 IF(.NOT.ALLOCATED(idx))ALLOCATE(idx(num_centroids))
350 DO k=1,num_centroids ; idx(k)=k; ENDDO
351 IF(num_centroids>0)
CALL quicksort(work(:,3), idx, 1, num_centroids)
352
353 DO k=1,num_centroids
357 ENDDO
358 IF(ALLOCATED(work))DEALLOCATE(work)
359
360
361
362
363
364 IF(num_centroids > 0)THEN
365 IF(mlw==151)THEN
366 nbmat = multi_fvm%NBMAT
367 ELSEIF(mlw==51)THEN
368 nbmat = 4
369 ELSE
370 nbmat = 1
371 ENDIF
375 DO i=1,nbmat
380 ENDDO
381 IF(mlw==151)THEN
382
389
390 DO k=1, num_centroids
391 ng = get_cell_fom_centroid(1,idx(k))
392 i = get_cell_fom_centroid(2,idx(k))
393 nft = iparg(3,ng)
399 ENDDO
400
401 DO isubmat=1,nbmat
402 DO k=1, num_centroids
403 ng = get_cell_fom_centroid(1,idx(k))
404 i = get_cell_fom_centroid(2,idx(k))
405 nft = iparg(3,ng)
407 state_inimap_buf(1)%SUBMAT(isubmat)%RHO(k) = multi_fvm%PHASE_RHO(isubmat,i+nft)
408 state_inimap_buf(1)%SUBMAT(isubmat)%E(k) = multi_fvm%PHASE_EINT(isubmat,i+nft)
410 ENDDO
411 ENDDO
412 ELSEIF(mlw==51)THEN
413 nb2=0
414 DO isubmat=1,nbmat
415 DO k=1, num_centroids
416 ng = get_cell_fom_centroid
417 i = get_cell_fom_centroid(2,idx(k))
418 nft = iparg(3,ng)
419 nel = iparg(2,ng)
420
421 iprt=ipart_ptr(n)
422 imat =ipart(1,iprt)
423 IF(mat_param(imat)%MULTIMAT%MID(isubmat) == 0)EXIT
424 nb2=
max(nb2,ipm(5,imat))
425 iadbuf = ipm(7,imat)
426 npar = ipm(9,imat)
427 nuvar = ipm(8,imat)
428 uparam => bufmat(iadbuf:iadbuf+npar)
429 kk = m51_n0phas + (uparam(276+isubmat)-1)*m51_nvphas
430 mbuf => elbuf_tab(ng)%BUFLY(1)%MAT(1,1,1)
435 ENDDO
436 ENDDO
438 ELSE
439 DO k=1, num_centroids
440 ng = get_cell_fom_centroid(1,idx(k))
441 i = get_cell_fom_centroid(2,idx(k))
442 gbuf => elbuf_tab(ng)%GBUF
443 nel =iparg(2,ng)
448 ENDDO
449 ENDIF
450 ENDIF
451
452
453
454 IF(num_centroids > 0)THEN
455 IF(mlw /= 151)THEN
456 ALLOCATE(work(numnod,4))
457
463 nnod=0
464 DO i=1,numnod
465 IF(nodtag(i) == 1)THEN
466 nnod=nnod+1
467
468
469
470
471 work(nnod,1) = x(2,i)
472 work(nnod,2) = x(3,i)
473 work(nnod,3) = v(2,i)
474 work(nnod,4) = v(3,i)
476 ENDIF
477 ENDDO
479
480 IF(ALLOCATED(idx))DEALLOCATE(idx)
481 IF(.NOT.ALLOCATED(idx))ALLOCATE(idx(nnod))
482 DO k=1,nnod ; idx(k)=k; ENDDO
484 DO k=1,nnod
489 ENDDO
490 IF(ALLOCATED(work))DEALLOCATE(work)
491
492
493 ELSE
494
495
496 ENDIF
497 ENDIF
498
499
500
501
502 IF(nspmd > 1)THEN
505
506 IF(ispmd == 0)THEN
511 DO i=2,nspmd
517 ENDDO
522 ENDIF
523 ENDIF
524
525
526
527
530 IF(ispmd == 0 .AND. nspmd > 1)THEN
531
532
533 npts_tot = 0
534 ncell_tot = 0
535 len_tot = zero
536 DO i=1,nspmd
538 npts(i)=0
539 len_(i)=zero
540 ncell(i)=0
541 cycle
542 ENDIF
544 npts_tot=npts_tot+npts(i)
546 len_tot=len_tot+len_(i)
548 ncell_tot = ncell_tot + ncell(i)
549 ENDDO
550 ALLOCATE(work(npts_tot,5))
551
552
553
554 j=0
555 DO i=1,nspmd
556 DO k=1,npts(i)
557 j=j+1
563 ENDDO
564 ENDDO
565
566
567 IF(ALLOCATED(idx))DEALLOCATE(idx)
568 IF(.NOT.ALLOCATED(idx))ALLOCATE(idx(npts_tot))
569 DO k=1,npts_tot ; idx(k)=k; ENDDO
570 CALL quicksort(work(:,5), idx, 1, npts_tot)
571
572
573
574
575
576 IF(mlw /= 151)THEN
577 ALLOCATE(nodtag_g(npts_tot))
578 nodtag_g(1:npts_tot)=1
579 k=0
580 DO j=2,npts_tot
581 IF(work(j,5) == work(j-1,5))THEN
582 nodtag_g(j)=0
583 k=k+1
584 ENDIF
585 ENDDO
586 ELSE
587 k=npts_tot
588 ENDIF
589
590
591
601 j=0
602 DO k=1,npts_tot
603 IF(mlw /= 151)THEN
604 IF(nodtag_g(k)==0)cycle
605 ENDIF
606 j=j+1
612 ENDDO
613 npts_tot = j
615 IF(ALLOCATED(work))DEALLOCATE(work)
616 IF(ALLOCATED(nodtag_g))DEALLOCATE(nodtag_g)
617
618 nbmat=1
619 DO i=1,nspmd
621 ENDDO
622 ALLOCATE(work(ncell_tot,3+4*nbmat))
623
624
625
626 j=0
627 DO i=1,nspmd
628 DO k=1,ncell(i)
629 j=j+1
634 DO jj=1,nbmat
639 ENDDO
640 ENDDO
641 ENDDO
642
643
644
649 DO jj=1,nbmat
654 ENDDO
658 DO jj=1,nbmat
663 ENDDO
664
665 IF(ALLOCATED(idx))DEALLOCATE(idx)
666 IF(.NOT.ALLOCATED(idx))ALLOCATE(idx(ncell_tot))
667 DO k=1,ncell_tot ; idx(k)=k; ENDDO
668 CALL quicksort(work(:,3), idx, 1, ncell_tot)
669
670 DO j=1,ncell_tot
675 DO jj=1,nbmat
680 ENDDO
681 ENDDO
684
685 endif
686
687 IF(ispmd == 0)THEN
688 IF(ncell_tot == 0 .OR. len_tot == zero)THEN
689 CALL ancmsg(msgid=284,anmode=aninfo,c1=
" -- 2D DOMAIN IS NOT DETECTED : CHECK X-PROJECTION")
690 return
691 ELSEIF(len_tot > 0 .AND. ncell_tot > 0)THEN
692 IF(lx/len_tot > em06)THEN
693 CALL ancmsg(msgid=284,anmode=aninfo,c1=
" -- 2D DOMAIN IS NOT DETECTED.")
694 return
695 ENDIF
696 ENDIF
697 ENDIF
698
699
700
701
702
703
704
705 IF(ispmd == 0)THEN
707 filnam=rootnam(1:rootlen)//'_2D_'//chstat//'.inimap'
708 OPEN(unit=220582,file=filnam(1:len(trim(filnam))),access='SEQUENTIAL',form='FORMATTED',status='UNKNOWN')
709 WRITE(unit=220582,fmt='(A,I10)') '#state file for mappgin with /INIMAP2D, iteration = '
710 WRITE(unit=220582,fmt='(A,A)') '# ROOTNAME = ',rootnam(1:rootlen)
711 WRITE(unit=220582,fmt='(A,I0)') '# VERSION = ',st_invers
712 WRITE(unit=220582,fmt='(A,F20.13)')'# TIME = ',tt
713 WRITE(unit=220582,fmt='(A,I10)') '# NCYCLE = ',ncycle
714 WRITE(unit=220582,fmt='(A,I10)') '# NCELL = ',ncell_tot
715
716
717
718
719 ENDIF
720
721 IF(ispmd == 0)THEN
722
729
730 ipos=0
731 DO isubmat = 1,nbmat
732 WRITE(unit=220582,fmt=2001)ipos+isubmat,isubmat
733 DO k=1, num_centroids
736 .
737 ENDDO
738
739 ENDDO
740
741 ipos=100
742 DO isubmat = 1,nbmat
743 WRITE(unit=220582,fmt=2002)ipos+isubmat,isubmat
744 DO k=1, num_centroids
748 ENDDO
749
750 ENDDO
751
752 ipos=200
753 DO isubmat = 1,nbmat
754 WRITE(unit=220582,fmt=2003)ipos+isubmat,isubmat
755 DO k=1, num_centroids
759 ENDDO
760
761 ENDDO
762
763 ipos=300
764 DO isubmat = 1,nbmat
765 WRITE(unit=220582,fmt=2004)ipos+isubmat,isubmat
766 DO k=1, num_centroids
770 ENDDO
771
772 ENDDO
773
774
775 WRITE(unit=220582,fmt=3000)
777 WRITE(unit=220582,fmt='(4E20.12,I10)')
780 ENDDO
781
782 ENDIF
783
784
785
786
787 IF(ispmd == 0)THEN
788
789 IF(ALLOCATED(get_cell_fom_centroid))DEALLOCATE(get_cell_fom_centroid)
790 DO jj=1,nspmd
793 DO i=1,nbmat
797 ENDDO
798 ENDIF
808 ENDDO
809
810
811 WRITE(unit=220582,fmt=1000)
812
813
814
815 idx1=(/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21/)
816 idx2=100+idx1
817 idx3=300+idx1
819 WRITE(unit=220582,fmt='(A)') '#/INIMAP2D/VP/1'
820 ELSE
821 WRITE(unit=220582,fmt='(A)') '#/INIMAP2D/VE/1'
822 ENDIF
823 WRITE(unit=220582,fmt='(A)') '#default input to update from /STATE/INIMAP2D'
824 WRITE(unit=220582,fmt='(A)') '## Node1 Node2 Node3'
825 WRITE(unit=220582,fmt='(A)') '# 0 0 0'
826 WRITE(unit=220582,fmt='(A)') '## Grbric Grquad Grtria'
827 WRITE(unit=220582,fmt='(A)') '# 0 0 0'
828 WRITE(unit=220582,fmt='(A)') '## Fct_v Fscale_v'
829 WRITE(unit=220582,fmt='(A)') '# 400 1.0'
830 DO imat=1,
min(21,nbmat)
831 WRITE(unit=220582,fmt='(A)') '## Fct_vf Fct_rho Fscale_rho Fct_p Fscale_p'
832 WRITE(unit=220582,fmt='(A1,I10,2(I10,F20.0))')'#', idx1(imat),idx2(imat),1.0,idx3(imat),1.0
833 ENDDO
834 WRITE(unit=220582,fmt=1000)
835
836 WRITE (iout,500) filnam(1:len
837 WRITE (istdo,500) filnam(1:len(trim(filnam)))
838
839 CLOSE(unit=220582)
840
841 ENDIF
842
844
845
846
847
848
849
850
851
852
853 500 FORMAT (4x,' STATE FILE:',1x,a,' WRITTEN')
854
855 1000 FORMAT('#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|'
856
857 1500 FORMAT('#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|',/,
858 . '/MOVE_FUNCT/',i0,/,
859 . 'move_function__',i0,/,
860 . '# ASCALEx FSCALEy ASHIFTx FSHIFTy',/,
861 . (6x,e14.7) )
862
863 2001 FORMAT('#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|',/,
864 . '/FUNC_2D/',i0,/,
865 . 'volume fraction submaterial_',i0,/,
866 . ' 1',/,
867 . '#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|')
868 2002 FORMAT('#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|',/,
869 . '/FUNC_2D/',i0,/,
870 . 'mass density submaterial_',i0,/,
871 . ' 1',/,
872 . '#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|')
873 2003 FORMAT('#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|',/,
874 . '/FUNC_2D/',i0,/,
875 . 'energy density submaterial_',i0,/,
876 . ' 1',/,
877 . '#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|')
878 2004 FORMAT('#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|',/,
879 . '/FUNC_2D/',i0,/,
880 . 'pressure submaterial_',i0,/,
881 . ' 1',/,
882 . '#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|')
883
884 3000 FORMAT('#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|',/,
885 . '/FUNC_2D/400',/,
886 . 'velocity_function'/,
887 . ' 2',/,
888 . '#---1----|----2----|----3----|----4----|----5----|----6----|----7----|----8----|----9----|---10----|')
889
890 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)