FrontISTR  6.0.0
Large-scale structural analysis program with finit element method
dynamic_output.f90
Go to the documentation of this file.
1 !-------------------------------------------------------------------------------
2 ! Copyright (c) 2019 FrontISTR Commons
3 ! This software is released under the MIT License, see LICENSE.txt
4 !-------------------------------------------------------------------------------
7  implicit none
8 contains
9 
11  !----------------------------------------------------------------------*
12  subroutine fstr_dynamic_output( cstep, istep, t_curr, hecMESH, fstrSOLID, fstrDYNAMIC, fstrPARAM, outflag )
13  !----------------------------------------------------------------------*
14  use m_fstr
16  use m_make_result
18  integer, intent(in) :: cstep
19  integer, intent(in) :: istep
20  real(kind=kreal), intent(in) :: t_curr
21  type(hecmwst_local_mesh), intent(in) :: hecmesh
22  type(fstr_solid), intent(inout) :: fstrSOLID
23  type(fstr_dynamic), intent(in) :: fstrDYNAMIC
24  type(fstr_param), intent(in) :: fstrPARAM
25  logical, intent(in) :: outflag
26 
27  type(hecmwst_result_data) :: fstrRESULT
28  integer(kind=kint) :: i, j, ndof, fnum, is, iE, gid
29  logical :: expflag
30 
31  ndof = hecmesh%n_dof
32  expflag = ( fstrdynamic%idx_eqa == 11 )
33 
34  if( fstrsolid%TEMP_ngrp_tot>0 .or. fstrsolid%TEMP_irres>0 ) then
35  if( ndof==3 ) then
36  allocate( fstrsolid%tnstrain(hecmesh%n_node*6) )
37  allocate( fstrsolid%testrain(hecmesh%n_elem*6) )
38  else if( ndof==2 ) then
39  allocate( fstrsolid%tnstrain(hecmesh%n_node*3) )
40  allocate( fstrsolid%testrain(hecmesh%n_elem*3) )
41  else if( ndof== 4) then
42  write(*,*)'Error: This routine is not implemented'
43  stop
44  endif
45  endif
46 
47  if( ndof==3 .or. ndof == 4 ) then
48  call fstr_nodalstress3d( hecmesh, fstrsolid )
49  else if( ndof==2 ) then
50  call fstr_nodalstress2d( hecmesh, fstrsolid )
51  else if( ndof==6 ) then
52  call fstr_nodalstress6d( hecmesh, fstrsolid )
53  endif
54 
55  if( associated( fstrsolid%contacts ) ) &
56  & call setup_contact_output_variables( hecmesh, fstrsolid, -1 )
57 
58  if( (mod(istep,fstrsolid%output_ctrl(1)%frequency)==0 .or. outflag) ) then
59  fnum = fstrsolid%output_ctrl(1)%filenum
60  call fstr_dynamic_post( fnum, cstep, istep, hecmesh, fstrsolid, fstrdynamic )
61  endif
62 
63  if( fstrsolid%output_ctrl(2)%outinfo%grp_id>0 .and. &
64  (mod(istep,fstrsolid%output_ctrl(2)%frequency)==0 .or. outflag) ) then
65  is = fstrsolid%output_ctrl(2)%outinfo%grp_id
66  fnum = fstrsolid%output_ctrl(2)%filenum
67  do i = hecmesh%node_group%grp_index(is-1)+1, hecmesh%node_group%grp_index(is)
68  ie = hecmesh%node_group%grp_item(i)
69  gid = hecmesh%global_node_ID(ie)
70  write(fnum,'(2i10,1p6e15.7)') istep,gid,(fstrsolid%unode(ndof*(ie-1)+j),j=1,ndof)
71  enddo
72  endif
73 
74  if( fstrparam%fg_result==1 .and. &
75  (mod(istep,fstrsolid%output_ctrl(3)%frequency)==0 .or. outflag) ) then
76  if( associated( fstrsolid%contacts ) ) &
77  & call setup_contact_output_variables( hecmesh, fstrsolid, 3, fstrdynamic%t_delta, expflag )
78  call fstr_write_result( hecmesh, fstrsolid, istep, t_curr, 0, fstrdynamic )
79  endif
80 
81  if( fstrparam%fg_visual==1 .and. &
82  (mod(istep,fstrsolid%output_ctrl(4)%frequency)==0 .or. outflag) ) then
83 
84  if( associated( fstrsolid%contacts ) ) &
85  & call setup_contact_output_variables( hecmesh, fstrsolid, 4, fstrdynamic%t_delta, expflag )
86  call fstr_make_result( hecmesh, fstrsolid, fstrresult, istep, t_curr, fstrdynamic )
87  call fstr2hecmw_mesh_conv( hecmesh )
88  call hecmw_visualize_init
89  call hecmw_visualize( hecmesh, fstrresult, istep )
90  call hecmw_visualize_finalize
91  call hecmw2fstr_mesh_conv( hecmesh )
92  call hecmw_result_free( fstrresult )
93  endif
94 
95  end subroutine fstr_dynamic_output
96 
98  !----------------------------------------------------------------------*
99  subroutine fstr_dynamic_post( fnum, cstep, istep, hecMESH, fstrSOLID, fstrDYNAMIC )
100  !----------------------------------------------------------------------*
101  use m_fstr
102  integer, intent(in) :: fnum
103  integer, intent(in) :: cstep
104  integer, intent(in) :: istep
105  type(hecmwst_local_mesh), intent(in) :: hecMESH
106  type(fstr_solid), intent(in) :: fstrSOLID
107  type(fstr_dynamic), intent(in) :: fstrDYNAMIC
108 
109  real(kind=kreal) :: umax(6), umin(6), vmax(6), vmin(6), amax(6), amin(6)
110  real(kind=kreal) :: emax(14), emin(14), smax(14), smin(14)
111  real(kind=kreal) :: mmax(1), mmin(1), emmax(1), emmin(1)
112  real(kind=kreal) :: eemax(14), eemin(14), esmax(14), esmin(14)
113 
114  real(kind=kreal) :: gumax(6), gumin(6), gvmax(6), gvmin(6), gamax(6), gamin(6)
115  real(kind=kreal) :: gemax(14), gemin(14), gsmax(14), gsmin(14)
116  real(kind=kreal) :: gmmax(1), gmmin(1), gemmax(1), gemmin(1)
117  real(kind=kreal) :: geemax(14), geemin(14), gesmax(14), gesmin(14)
118 
119  integer(kind=kint) :: IUmax(6), IUmin(6), IVmax(6), IVmin(6), IAmax(6), IAmin(6)
120  integer(kind=kint) :: IEmax(14), IEmin(14), ISmax(14), ISmin(14)
121  integer(kind=kint) :: IMmax(1), IMmin(1), IEMmax(1), IEMmin(1)
122  integer(kind=kint) :: IEEmax(14), IEEmin(14), IESmax(14), IESmin(14)
123  integer(kind=kint) :: i, j, k, ndof, mdof, ID_area, idx
124  integer(kind=kint) :: label(6)
125 
126  if( istep==0 ) return
127  if( fstrdynamic%idx_eqa/=11 .and. istep>0 ) then
128  idx = 2
129  else
130  idx = 1
131  endif
132  ndof = hecmesh%n_dof
133 
134  write( fnum, '(''#### Result step, substep='',I6,I6)') cstep, istep
135  select case (ndof)
136  case (2)
137  mdof = 3
138  label(1)=11;label(2)=22
139  label(3)=12
140  case (3,4,6)
141  mdof = 6
142  label(1)=11;label(2)=22;label(3)=33;
143  label(4)=12;label(5)=23;label(6)=31;
144  end select
145 
146  j = hecmesh%global_node_ID(1)
147  do k = 1, ndof
148  umax(k) = fstrdynamic%DISP(k,idx); umin(k) = fstrdynamic%DISP(k,idx)
149  vmax(k) = fstrdynamic%VEL(k,idx); vmin(k) = fstrdynamic%VEL(k,idx)
150  amax(k) = fstrdynamic%ACC(k,idx); amin(k) = fstrdynamic%ACC(k,idx)
151  iumax(k)= j; iumin(k)= j; ivmax(k)= j; ivmin(k)= j; iamax(k)= j; iamin(k)= j
152  enddo
153  do k = 1, mdof
154  emax(k) = fstrsolid%STRAIN(k); emin(k) = fstrsolid%STRAIN(k)
155  smax(k) = fstrsolid%STRESS(k); smin(k) = fstrsolid%STRESS(k)
156  eemax(k) = fstrsolid%ESTRAIN(k); eemin(k) = fstrsolid%ESTRAIN(k)
157  esmax(k) = fstrsolid%ESTRESS(k); esmin(k) = fstrsolid%ESTRESS(k)
158  iemax(k)= j; iemin(k)= j; ismax(k)= j; ismin(k)= j
159  ieemax(k)= j; ieemin(k)= j; iesmax(k)= j; iesmin(k)= j
160  enddo
161  mmax(1) = fstrsolid%MISES(1); mmin(1) = fstrsolid%MISES(1)
162  emmax(1) = fstrsolid%EMISES(1); emmin(1) = fstrsolid%EMISES(1)
163  immax(1)= j; immin(1)= j; iemmax(1)= j; iemmin(1)= j
164 
165  !C*** Show Displacement / Velosity / Acc
166  do i = 1, hecmesh%nn_internal
167  if(fstrsolid%is_rot(i)==1)cycle
168  j = hecmesh%global_node_ID(i)
169  do k = 1, ndof
170  if ( fstrdynamic%DISP(ndof*(i-1)+k,idx) > umax(k) ) then
171  umax(k) = fstrdynamic%DISP(ndof*(i-1)+k,idx)
172  iumax(k)= j
173  else if( fstrdynamic%DISP(ndof*(i-1)+k,idx) < umin(k) ) then
174  umin(k) = fstrdynamic%DISP(ndof*(i-1)+k,idx)
175  iumin(k)= j
176  endif
177  if ( fstrdynamic%VEL(ndof*(i-1)+k,idx) > vmax(k) ) then
178  vmax(k) = fstrdynamic%VEL(ndof*(i-1)+k,idx)
179  ivmax(k)= j
180  else if( fstrdynamic%VEL(ndof*(i-1)+k,idx) < vmin(k) ) then
181  vmin(k) = fstrdynamic%VEL(ndof*(i-1)+k,idx)
182  ivmin(k)= j
183  endif
184  if ( fstrdynamic%ACC(ndof*(i-1)+k,idx) > amax(k) ) then
185  amax(k) = fstrdynamic%ACC(ndof*(i-1)+k,idx)
186  iamax(k)= j
187  else if( fstrdynamic%ACC(ndof*(i-1)+k,idx) < amin(k) ) then
188  amin(k) = fstrdynamic%ACC(ndof*(i-1)+k,idx)
189  iamin(k)= j
190  endif
191  enddo
192  enddo
193  !C*** Nodal Strain / Stress / MISES
194  !C @node
195  do i = 1, hecmesh%nn_internal
196  if(fstrsolid%is_rot(i)==1)cycle
197  j = hecmesh%global_node_ID(i)
198  do k = 1, mdof
199  if ( fstrsolid%STRAIN(mdof*(i-1)+k) > emax(k) ) then
200  emax(k) = fstrsolid%STRAIN(mdof*(i-1)+k)
201  iemax(k)= j
202  else if( fstrsolid%STRAIN(mdof*(i-1)+k) < emin(k) ) then
203  emin(k) = fstrsolid%STRAIN(mdof*(i-1)+k)
204  iemin(k)= j
205  endif
206  if ( fstrsolid%STRESS(mdof*(i-1)+k) > smax(k) ) then
207  smax(k) = fstrsolid%STRESS(mdof*(i-1)+k)
208  ismax(k)= j
209  else if( fstrsolid%STRESS(mdof*(i-1)+k) < smin(k) ) then
210  smin(k) = fstrsolid%STRESS(mdof*(i-1)+k)
211  ismin(k)= j
212  endif
213  enddo
214  if ( fstrsolid%MISES(i) > mmax(1) ) then
215  mmax(1) = fstrsolid%MISES(i)
216  immax(1)= j
217  else if( fstrsolid%MISES(i) < mmin(1) ) then
218  mmin(1) = fstrsolid%MISES(i)
219  immin(1)= j
220  endif
221  enddo
222  !C*** Elemental Strain / STRESS
223  do i = 1, hecmesh%n_elem
224  id_area = hecmesh%elem_ID(i*2)
225  if( id_area==hecmesh%my_rank ) then
226  j = hecmesh%global_elem_ID(i)
227  do k = 1, mdof
228  if( fstrsolid%ESTRAIN(mdof*(i-1)+k) > eemax(k) ) then
229  eemax(k) = fstrsolid%ESTRAIN(mdof*(i-1)+k)
230  ieemax(k)= j
231  else if( fstrsolid%ESTRAIN(mdof*(i-1)+k) < eemin(k) ) then
232  eemin(k) = fstrsolid%ESTRAIN(mdof*(i-1)+k)
233  ieemin(k)= j
234  endif
235  if( fstrsolid%ESTRESS(mdof*(i-1)+k) > esmax(k) ) then
236  esmax(k) = fstrsolid%ESTRESS(mdof*(i-1)+k)
237  iesmax(k)= j
238  else if( fstrsolid%ESTRESS(mdof*(i-1)+k) < esmin(k) ) then
239  esmin(k) = fstrsolid%ESTRESS(mdof*(i-1)+k)
240  iesmin(k)= j
241  endif
242  enddo
243  if( fstrsolid%EMISES(i) > emmax(1) ) then
244  emmax(1) = fstrsolid%EMISES(i)
245  iemmax(1)= j
246  else if( fstrsolid%EMISES(i) < emmin(1) ) then
247  emmin(1) = fstrsolid%EMISES(i)
248  iemmin(1)= j
249  endif
250  endif
251  enddo
252 
253 
254  write(ilog,*) '##### Local Summary @Node :Max/IdMax/Min/IdMin####'
255  do i = 1, ndof; write(ilog,1029) ' //U',i, ' ',umax(i),iumax(i),umin(i),iumin(i); end do
256  if (ndof == 4) write(ilog,1009) ' //P ' , umax(4),iumax(4),umin(4),iumin(4)
257  do i = 1, ndof; write(ilog,1029) ' //V',i, ' ',vmax(i),ivmax(i),vmin(i),ivmin(i); end do
258  do i = 1, ndof; write(ilog,1029) ' //A',i, ' ',amax(i),iamax(i),amin(i),iamin(i); end do
259  do i = 1, mdof; write(ilog,1029) ' //E',label(i),' ',emax(i),iemax(i),emin(i),iemin(i); end do
260  do i = 1, mdof; write(ilog,1029) ' //S',label(i),' ',smax(i),ismax(i),smin(i),ismin(i); end do
261  write(ilog,1009) '//SMS ' ,mmax(1),immax(1),mmin(1),immin(1)
262  write(ilog,*) '##### Local Summary @Element :Max/IdMax/Min/IdMin####'
263  do i = 1, mdof; write(ilog,1029) ' //E',label(i),' ',eemax(i),ieemax(i),eemin(i),ieemin(i); end do
264  do i = 1, mdof; write(ilog,1029) ' //S',label(i),' ',esmax(i),iesmax(i),esmin(i),iesmin(i); end do
265  write(ilog,1009) '//SMS ' ,emmax(1),iemmax(1),emmin(1),iemmin(1)
266 
267  !C*** Show Summary
268  gumax(1:ndof) = umax(1:ndof); gumin(1:ndof) = umin(1:ndof)
269  gvmax(1:ndof) = vmax(1:ndof); gvmin(1:ndof) = vmin(1:ndof)
270  gamax(1:ndof) = amax(1:ndof); gamin(1:ndof) = amin(1:ndof)
271  gemax(1:mdof) = emax(1:mdof); gemin(1:mdof) = emin(1:mdof); geemax(1:mdof) = eemax(1:mdof); geemin(1:mdof) = eemin(1:mdof)
272  gsmax(1:mdof) = smax(1:mdof); gsmin(1:mdof) = smin(1:mdof); gesmax(1:mdof) = esmax(1:mdof); gesmin(1:mdof) = esmin(1:mdof)
273  gmmax = mmax; gmmin = mmin; gemmax = emmax; gemmin = emmin;
274 
275  call hecmw_allreduce_r(hecmesh,gumax,ndof,hecmw_max)
276  call hecmw_allreduce_r(hecmesh,gumin,ndof,hecmw_min)
277  call hecmw_allreduce_r(hecmesh,gvmax,ndof,hecmw_max)
278  call hecmw_allreduce_r(hecmesh,gvmin,ndof,hecmw_min)
279  call hecmw_allreduce_r(hecmesh,gamax,ndof,hecmw_max)
280  call hecmw_allreduce_r(hecmesh,gamin,ndof,hecmw_min)
281  call hecmw_allreduce_r(hecmesh,gemax,mdof,hecmw_max)
282  call hecmw_allreduce_r(hecmesh,gemin,mdof,hecmw_min)
283  call hecmw_allreduce_r(hecmesh,gsmax,mdof,hecmw_max)
284  call hecmw_allreduce_r(hecmesh,gsmin,mdof,hecmw_min)
285  call hecmw_allreduce_r(hecmesh,gmmax,1,hecmw_max)
286  call hecmw_allreduce_r(hecmesh,gmmin,1,hecmw_min)
287  call hecmw_allreduce_r(hecmesh,geemax,mdof,hecmw_max)
288  call hecmw_allreduce_r(hecmesh,geemin,mdof,hecmw_min)
289  call hecmw_allreduce_r(hecmesh,gesmax,mdof,hecmw_max)
290  call hecmw_allreduce_r(hecmesh,gesmin,mdof,hecmw_min)
291  call hecmw_allreduce_r(hecmesh,gemmax,1,hecmw_max)
292  call hecmw_allreduce_r(hecmesh,gemmin,1,hecmw_min)
293 
294  do i=1,ndof
295  if(gumax(i) > umax(i)) iumax(i) = 0
296  if(gvmax(i) > vmax(i)) ivmax(i) = 0
297  if(gamax(i) > amax(i)) iamax(i) = 0
298  if(gumin(i) < umin(i)) iumin(i) = 0
299  if(gvmin(i) < vmin(i)) ivmin(i) = 0
300  if(gamin(i) < amin(i)) iamin(i) = 0
301  enddo
302  do i=1,mdof
303  if(gemax(i) > emax(i)) iemax(i) = 0
304  if(gsmax(i) > smax(i)) ismax(i) = 0
305  if(geemax(i) > eemax(i)) ieemax(i) = 0
306  if(gesmax(i) > esmax(i)) iesmax(i) = 0
307  if(gemin(i) < emin(i)) iemin(i) = 0
308  if(gsmin(i) < smin(i)) ismin(i) = 0
309  if(geemin(i) < eemin(i)) ieemin(i) = 0
310  if(gesmin(i) < esmin(i)) iesmin(i) = 0
311  enddo
312  do i=1,1
313  if(gmmax(i) > mmax(i)) immax(i) = 0
314  if(gemmax(i) > emmax(i)) iemmax(i) = 0
315  if(gmmin(i) < mmin(i)) immin(i) = 0
316  if(gemmin(i) < emmin(i)) iemmin(i) = 0
317  enddo
318 
319  call hecmw_allreduce_i(hecmesh,iumax,ndof,hecmw_max)
320  call hecmw_allreduce_i(hecmesh,iumin,ndof,hecmw_max)
321  call hecmw_allreduce_i(hecmesh,ivmax,ndof,hecmw_max)
322  call hecmw_allreduce_i(hecmesh,ivmin,ndof,hecmw_max)
323  call hecmw_allreduce_i(hecmesh,iamax,ndof,hecmw_max)
324  call hecmw_allreduce_i(hecmesh,iamin,ndof,hecmw_max)
325  call hecmw_allreduce_i(hecmesh,iemax,mdof,hecmw_max)
326  call hecmw_allreduce_i(hecmesh,iemin,mdof,hecmw_max)
327  call hecmw_allreduce_i(hecmesh,ismax,mdof,hecmw_max)
328  call hecmw_allreduce_i(hecmesh,ismin,mdof,hecmw_max)
329  call hecmw_allreduce_i(hecmesh,immax,1,hecmw_max)
330  call hecmw_allreduce_i(hecmesh,immin,1,hecmw_max)
331  call hecmw_allreduce_i(hecmesh,ieemax,mdof,hecmw_max)
332  call hecmw_allreduce_i(hecmesh,ieemin,mdof,hecmw_max)
333  call hecmw_allreduce_i(hecmesh,iesmax,mdof,hecmw_max)
334  call hecmw_allreduce_i(hecmesh,iesmin,mdof,hecmw_max)
335  call hecmw_allreduce_i(hecmesh,iemmax,1,hecmw_max)
336  call hecmw_allreduce_i(hecmesh,iemmin,1,hecmw_max)
337 
338  if( hecmesh%my_rank==0 ) then
339  write(ilog,*) '##### Global Summary @Node :Max/IdMax/Min/IdMin####'
340  do i = 1, ndof; write(ilog,1029) ' //U',i, ' ',gumax(i),iumax(i),gumin(i),iumin(i); end do
341  if (ndof == 4) write(ilog,1009) ' //P ' ,gumax(4),iumax(4),gumin(4),iumin(4)
342  do i = 1, ndof; write(ilog,1029) ' //V',i, ' ',gvmax(i),ivmax(i),gvmin(i),ivmin(i); end do
343  do i = 1, ndof; write(ilog,1029) ' //A',i, ' ',gamax(i),iamax(i),gamin(i),iamin(i); end do
344  do i = 1, mdof; write(ilog,1029) ' //E',label(i),' ',gemax(i),iemax(i),gemin(i),iemin(i); end do
345  do i = 1, mdof; write(ilog,1029) ' //S',label(i),' ',gsmax(i),ismax(i),gsmin(i),ismin(i); end do
346  write(ilog,1009) '//SMS ' ,gmmax(1),immax(1),gmmin(1),immin(1)
347  write(ilog,*) '##### Global Summary @Element :Max/IdMax/Min/IdMin####'
348  do i = 1, mdof; write(ilog,1029) ' //E',label(i),' ',geemax(i),ieemax(i),geemin(i),ieemin(i); end do
349  do i = 1, mdof; write(ilog,1029) ' //S',label(i),' ',gesmax(i),iesmax(i),gesmin(i),iesmin(i); end do
350  write(ilog,1009) '//SMS ' ,gemmax(1),iemmax(1),gemmin(1),iemmin(1)
351  endif
352 
353  1009 format(a7,1pe12.4,i10,1pe12.4,i10)
354  1029 format(a,i0,a,1pe12.4,i10,1pe12.4,i10)
355  end subroutine fstr_dynamic_post
356 
357  !C================================================================C
358  !C-- subroutine dynamic_output_monit
359  !C================================================================C
360  subroutine dynamic_output_monit(cstep, istep, t_curr, hecMESH, fstrDYNAMIC, fstrEIG, fstrSOLID)
361  use m_fstr
362  integer, intent(in) :: cstep
363  integer, intent(in) :: istep
364  real(kind=kreal), intent(in) :: t_curr
365  type(hecmwst_local_mesh) :: hecmesh
366  type(fstr_dynamic) :: fstrDYNAMIC
367  type(fstr_eigen) :: fstrEIG
368  type(fstr_solid) :: fstrSOLID
369 
370  integer(kind=kint) :: idx, ii, jj, ierr, ncmp
371  integer(kind=kint) :: num_monit, ig, is, iE, ik, iunitS, iunit
372  logical :: yes
373 
374  if( mod(istep,fstrdynamic%nout_monit)/=0 ) return
375 
376  if( fstrdynamic%idx_eqa/=11 .and. istep>0 ) then
377  idx = 2
378  else
379  idx = 1
380  endif
381 
382  num_monit = 0
383  ig = fstrdynamic%ngrp_monit
384  is = hecmesh%node_group%grp_index(ig-1)+1
385  ie = hecmesh%node_group%grp_index(ig)
386  do ik=is,ie
387  ii = hecmesh%node_group%grp_item(ik)
388  if (ii > hecmesh%nn_internal) cycle
389  num_monit = num_monit+1
390  jj = hecmesh%global_node_id(ii)
391  iunits = 10*(num_monit-1)
392 
393  !C-- displacement
394  if( fstrdynamic%iout_list(1)==1 ) then
395  iunit = iunits + fstrdynamic%dynamic_IW4
396  write( iunit, '(i10, i10,1pe13.4e3,i10,1p6e13.4e3)' ) &
397  cstep, istep, t_curr, jj, &
398  fstrdynamic%DISP( hecmesh%n_dof*(ii-1)+1 : hecmesh%n_dof*ii , idx )
399  end if
400  !C-- velocity
401  if( fstrdynamic%iout_list(2)==1 ) then
402  iunit = iunits + fstrdynamic%dynamic_IW5
403  write( iunit, '(i10, i10,1pe13.4e3,i10,1p6e13.4e3)' ) &
404  cstep, istep, t_curr, jj, &
405  fstrdynamic%VEL( hecmesh%n_dof*(ii-1)+1 : hecmesh%n_dof*ii , idx )
406  end if
407  !C-- acceleration
408  if( fstrdynamic%iout_list(3)==1 ) then
409  iunit = iunits + fstrdynamic%dynamic_IW6
410  write( iunit, '(i10, i10,1pe13.4e3,i10,1p6e13.4e3)' ) &
411  cstep, istep, t_curr, jj, &
412  fstrdynamic%ACC( hecmesh%n_dof*(ii-1)+1 : hecmesh%n_dof*ii , idx )
413  end if
414  !C-- nodal force
415  if( fstrdynamic%iout_list(4)==1 ) then
416  iunit = iunits + fstrdynamic%dynamic_IW7
417  write( iunit, '(i10, i10,1pe13.4e3,i10,1p6e13.4e3)' ) &
418  cstep, istep, t_curr, jj, &
419  fstrsolid%QFORCE( hecmesh%n_dof*(ii-1)+1 : hecmesh%n_dof*ii )
420  end if
421  !C-- strain
422  if( fstrdynamic%iout_list(5) > 0 ) then
423  if (hecmesh%n_dof == 2 .or. hecmesh%n_dof == 3 .or. hecmesh%n_dof == 4) then
424  ncmp = 6
425  else
426  ncmp = 12
427  endif
428  iunit = iunits + fstrdynamic%dynamic_IW8
429  write( iunit, '(i10, i10,1pe13.4e3,i10,1p6e13.4e3)') &
430  cstep, istep, t_curr, jj, &
431  fstrsolid%STRAIN( ncmp*(ii-1)+1 : ncmp*ii )
432  end if
433  !C-- stress
434  if( fstrdynamic%iout_list(6) > 0 ) then
435  if (hecmesh%n_dof == 2 .or. hecmesh%n_dof == 3 .or. hecmesh%n_dof == 4) then
436  ncmp = 6
437  else
438  ncmp = 12
439  endif
440  iunit = iunits + fstrdynamic%dynamic_IW9
441  write( iunit, '(i10, i10,1pe13.4e3,i10,1p7e13.4e3)') &
442  cstep, istep, t_curr, jj, &
443  fstrsolid%STRESS( ncmp*(ii-1)+1 : ncmp*ii )
444  end if
445  enddo
446 
447  if( hecmesh%my_rank==0 ) then
448  if( any(fstrdynamic%iout_list(1:3)==1) ) then
449  inquire( file='dyna_energy.txt', opened=yes )
450  if( .not. yes ) then
451  open( fstrdynamic%dynamic_IW10, file='dyna_energy.txt', status='replace', iostat=ierr )
452  if( ierr/=0 ) then
453  write(*,*) 'stop due to file opening error <dyna_enrgy.txt>'
454  call hecmw_abort( hecmw_comm_get_comm() )
455  endif
456  write( fstrdynamic%dynamic_IW10, * ) &
457  ' time step', ' time ', ' kinetic energy', ' strain energy', ' total energy'
458  endif
459  if(istep==0 .and. fstrdynamic%idx_eqa==11) then
460  fstrdynamic%kineticEnergy = 0.0d0
461  do ii = 1, hecmesh%n_node*hecmesh%n_dof
462  fstrdynamic%kineticEnergy = fstrdynamic%kineticEnergy &
463  + 0.5d0 * fstreig%mass(ii) * fstrdynamic%VEL(ii,idx) * fstrdynamic%VEL(ii,idx)
464  enddo
465  endif
466  fstrdynamic%totalEnergy = fstrdynamic%kineticEnergy + fstrdynamic%strainEnergy
467  write( fstrdynamic%dynamic_IW10, '(i10, i10,1pe13.4e3,1p3e16.4e3)' ) &
468  cstep, istep, t_curr, &
469  fstrdynamic%kineticEnergy, fstrdynamic%strainEnergy, fstrdynamic%totalEnergy
470  endif
471  if( istep==fstrdynamic%n_step ) close(fstrdynamic%dynamic_IW10)
472  endif
473  end subroutine dynamic_output_monit
474 
475  !C================================================================C
476  !C-- subroutine matvec
477  !C================================================================C
478  subroutine matvec(y,x,hecMAT,ndof,D,AU,AL)
479  use m_fstr
480  type(hecmwst_matrix) :: hecMAT
481 
482  integer(kind=kint) :: ndof, i, is, ie, j, icol, ki, kj, ix, iy, ip, nn
483  real(kind=kreal) :: d(ndof*ndof*hecmat%NP)
484  real(kind=kreal) :: au(ndof*ndof*hecmat%NPU)
485  real(kind=kreal) :: al(ndof*ndof*hecmat%NPL)
486  real(kind=kreal) :: x(ndof*hecmat%NP)
487  real(kind=kreal) :: y(ndof*hecmat%NP)
488 
489  nn=ndof*ndof
490 
491  y=0.0d0
492 
493  do i=1,hecmat%NP
494  is=hecmat%indexU(i-1)+1
495  ie=hecmat%indexU(i)
496  do j=is,ie
497  icol=hecmat%itemU(j)
498  do ki=1,ndof
499  iy=ndof*(i-1)+ki
500  do kj=1,ndof
501  ix=ndof*(icol-1)+kj
502  ip=nn*(j-1)+ndof*(ki-1)+kj
503  y(iy)=y(iy)+au(ip)*x(ix)
504  enddo
505  enddo
506  enddo
507  enddo
508 
509  do i=1,hecmat%NP
510  is=hecmat%indexL(i-1)+1
511  ie=hecmat%indexL(i)
512  do j=is,ie
513  icol=hecmat%itemL(j)
514  do ki=1,ndof
515  iy=ndof*(i-1)+ki
516  do kj=1,ndof
517  ix=ndof*(icol-1)+kj
518  ip=nn*(j-1)+ndof*(ki-1)+kj
519  y(iy)=y(iy)+al(ip)*x(ix)
520  enddo
521  enddo
522  enddo
523  enddo
524 
525  do i=1,hecmat%NP
526  do ki=1,ndof
527  iy=ndof*(i-1)+ki
528  do kj=1,ndof
529  ix=ndof*(i-1)+kj
530  ip=nn*(i-1)+ndof*(ki-1)+kj
531  y(iy)=y(iy)+d(ip)*x(ix)
532  enddo
533  enddo
534  enddo
535  end subroutine matvec
536 
537 end module m_dynamic_output
This module provides functions to output result.
subroutine fstr_dynamic_output(cstep, istep, t_curr, hecMESH, fstrSOLID, fstrDYNAMIC, fstrPARAM, outflag)
Output result.
subroutine dynamic_output_monit(cstep, istep, t_curr, hecMESH, fstrDYNAMIC, fstrEIG, fstrSOLID)
subroutine matvec(y, x, hecMAT, ndof, D, AU, AL)
subroutine fstr_dynamic_post(fnum, cstep, istep, hecMESH, fstrSOLID, fstrDYNAMIC)
Summarizer of output data which prints out max and min output values.
This module provides functions to calculation nodal stress.
subroutine fstr_nodalstress3d(hecMESH, fstrSOLID)
Calculate NODAL STRESS of solid elements.
subroutine fstr_nodalstress6d(hecMESH, fstrSOLID)
Calculate NODAL STRESS of shell elements.
subroutine fstr_nodalstress2d(hecMESH, fstrSOLID)
Calculate NODAL STRESS of plane elements.
This module defines common data and basic structures for analysis.
Definition: m_fstr.F90:15
integer(kind=kint), parameter ilog
FILE HANDLER.
Definition: m_fstr.F90:118
HECMW to FSTR Mesh Data Converter. Converting Connectivity of Element Type 232, 342 and 352.
subroutine fstr2hecmw_mesh_conv(hecMESH)
subroutine hecmw2fstr_mesh_conv(hecMESH)
This module provide a function to prepare output of static analysis.
Definition: make_result.f90:6
subroutine, public fstr_write_result(hecMESH, fstrSOLID, istep, time, flag, fstrDYNAMIC)
OUTPUT result file for static and dynamic analysis.
Definition: make_result.f90:25
subroutine, public setup_contact_output_variables(hecMESH, fstrSOLID, phase, dtime, expflag)
subroutine, public fstr_make_result(hecMESH, fstrSOLID, fstrRESULT, istep, time, fstrDYNAMIC, label_suffix)
MAKE RESULT for static and dynamic analysis (WITHOUT ELEMENTAL RESULTS) -----------------------------...
Data for DYNAMIC ANSLYSIS (fstrDYNAMIC)
Definition: m_fstr.F90:525
Package of data used by Lanczos eigenvalue solver.
Definition: m_fstr.F90:623
FSTR INNER CONTROL PARAMETERS (fstrPARAM)
Definition: m_fstr.F90:142