FrontISTR  5.8.0
Large-scale structural analysis program with finit element method
fstr_setup.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 !-------------------------------------------------------------------------------
8  use m_fstr
12  use fstr_ctrl_heat
13  use fstr_ctrl_eigen
16  use mcontact
17  use mcontactparam
19  use m_out
20  use m_step
21  use m_utilities
23  implicit none
24 
27  type(hecmwst_local_mesh), pointer :: mesh
28  type(fstr_param), pointer :: param
29  type(fstr_solid), pointer :: solid
30  type(fstr_heat), pointer :: heat
31  type(fstr_eigen), pointer :: eigen
32  type(fstr_dynamic), pointer :: dyn
33  type(fstr_couple), pointer :: cpl
34  type(fstr_freqanalysis), pointer :: freq
35  end type fstr_param_pack
36 
37 contains
38 
39  !=============================================================================!
41  !=============================================================================!
42  subroutine fstr_setup( cntl_filename, hecMESH, fstrPARAM, &
43  fstrSOLID, fstrEIG, fstrHEAT, fstrDYNAMIC, fstrCPL, fstrFREQ )
44  use mmaterial
45  character(len=HECMW_FILENAME_LEN) :: cntl_filename, input_filename
46  type(hecmwst_local_mesh),target :: hecMESH
47  type(fstr_param),target :: fstrPARAM
48  type(fstr_solid),target :: fstrSOLID
49  type(fstr_eigen),target :: fstrEIG
50  type(fstr_heat),target :: fstrHEAT
51  type(fstr_dynamic),target :: fstrDYNAMIC
52  type(fstr_couple),target :: fstrCPL
53  type(fstr_freqanalysis), target :: fstrFREQ
54 
55  integer(kind=kint) :: ctrl, ctrl_list(20), ictrl
56  type(fstr_param_pack) :: P
57 
58  integer, parameter :: MAXOUTFILE = 10
59  double precision, parameter :: dpi = 3.14159265358979323846d0
60 
61  integer(kind=kint) :: version, result, visual, femap, n_totlyr
62  integer(kind=kint) :: rcode, n, i, j, cid, nout, nin, ierror, cparam_id
63  character(len=HECMW_NAME_LEN) :: header_name, fname(MAXOUTFILE)
64  real(kind=kreal) :: ee, pp, rho, alpha, thick, alpha_over_mu
65  real(kind=kreal) :: beam_radius, &
66  beam_angle1, beam_angle2, beam_angle3,&
67  beam_angle4, beam_angle5, beam_angle6
68  logical :: isOK
69  type(t_output_ctrl) :: outctrl
70  type(tshellmat),pointer :: shmat(:)
71  character(len=HECMW_FILENAME_LEN) :: logfileNAME, mName, mName2
72 
73  ! counters
74  integer(kind=kint) :: c_solution, c_solver, c_nlsolver, c_step, c_write, c_echo, c_amplitude
75  integer(kind=kint) :: c_static, c_boundary, c_cload, c_dload, c_temperature, c_reftemp, c_spring, c_elemact
76  integer(kind=kint) :: c_heat, c_fixtemp, c_cflux, c_dflux, c_sflux, c_film, c_sfilm, c_radiate, c_sradiate
77  integer(kind=kint) :: c_eigen, c_contact, c_contactparam, c_embed, c_contact_if
78  integer(kind=kint) :: c_dynamic, c_velocity, c_acceleration
79  integer(kind=kint) :: c_fload, c_eigenread
80  integer(kind=kint) :: c_couple, c_material
81  integer(kind=kint) :: c_mpc, c_weldline, c_initial
82  integer(kind=kint) :: c_istep, c_localcoord, c_section
83  integer(kind=kint) :: c_elemopt, c_aincparam, c_timepoints
84  integer(kind=kint) :: c_output, islog
85  integer(kind=kint) :: k
86  integer(kind=kint) :: cache = 1
87 
88  write( logfilename, '(i5,''.log'')' ) myrank
89 
90  ! packaging
91  p%MESH => hecmesh
92  p%PARAM => fstrparam
93  p%SOLID => fstrsolid
94  p%EIGEN => fstreig
95  p%HEAT => fstrheat
96  p%DYN => fstrdynamic
97  p%CPL => fstrcpl
98  p%FREQ => fstrfreq
99 
100  fstrparam%contact_algo = kcaalagrange
101 
102  c_solution = 0; c_solver = 0; c_nlsolver = 0; c_step = 0; c_output = 0; c_echo = 0; c_amplitude = 0
103  c_static = 0; c_boundary = 0; c_cload = 0; c_dload = 0; c_temperature = 0; c_reftemp = 0; c_spring = 0;
104  c_elemact = 0;
105  c_heat = 0; c_fixtemp = 0; c_cflux = 0; c_dflux = 0; c_sflux = 0
106  c_film = 0; c_sfilm = 0; c_radiate= 0; c_sradiate = 0
107  c_eigen = 0; c_contact = 0; c_contactparam = 0; c_embed = 0; c_contact_if = 0
108  c_dynamic = 0; c_velocity = 0; c_acceleration = 0
109  c_couple = 0; c_material = 0; c_section =0
110  c_mpc = 0; c_weldline = 0; c_initial = 0
111  c_istep = 0; c_localcoord = 0
112  c_fload = 0; c_eigenread = 0
113  c_elemopt = 0;
114  c_aincparam= 0; c_timepoints = 0
115 
116  ctrl_list = 0
117  ictrl = 1
118  ctrl = fstr_ctrl_open( cntl_filename )
119  if( ctrl < 0 ) then
120  write(*,*) '### Error: Cannot open FSTR control file : ', cntl_filename
121  write(ilog,*) '### Error: Cannot open FSTR control file : ', cntl_filename
122  stop
123  end if
124 
125  version =0
126  do
127  rcode = fstr_ctrl_get_c_h_name( ctrl, header_name, hecmw_name_len )
128  if( header_name == '!VERSION' ) then
129  rcode = fstr_ctrl_get_data_ex( ctrl, 1, 'i ', version )
130  else if( header_name == '!SOLUTION' ) then
131  c_solution = c_solution + 1
132  call fstr_setup_solution( ctrl, c_solution, p )
133  else if( header_name == '!NONLINEAR_SOLVER' ) then
134  c_nlsolver = c_nlsolver + 1
135  call fstr_setup_nonlinear_solver( ctrl, c_nlsolver, p )
136  else if( header_name == '!SOLVER' ) then
137  c_solver = c_solver + 1
138  call fstr_setup_solver( ctrl, c_solver, p )
139  else if( header_name == '!ISTEP' ) then
140  c_istep = c_istep + 1
141  else if( header_name == '!STEP' ) then
142  if( version==0 ) then
143  c_step = c_step + 1
144  call fstr_setup_step( ctrl, c_step, p )
145  else
146  c_istep = c_istep + 1
147  endif
148  else if( header_name == '!WRITE' ) then
149  call fstr_ctrl_get_output( ctrl, outctrl, islog, result, visual, femap )
150  if( visual==1 ) p%PARAM%fg_visual= 1
151  if( result==1 ) p%PARAM%fg_result = 1
152  c_output = c_output+1
153  else if( header_name == '!ECHO' ) then
154  c_echo = c_echo + 1
155  call fstr_setup_echo( ctrl, c_echo, p )
156  else if( header_name == '!RESTART' ) then
157  call fstr_setup_restart( ctrl, nout, p%PARAM%restart_version )
158  fstrsolid%restart_nout= nout
159  fstrdynamic%restart_nout= nout
160  fstrheat%restart_nout= nout
161  else if( header_name == '!ORIENTATION' ) then
162  c_localcoord = c_localcoord + 1
163  else if( header_name == '!AUTOINC_PARAM' ) then
164  c_aincparam = c_aincparam + 1
165  else if( header_name == '!TIME_POINTS' ) then
166  c_timepoints = c_timepoints + 1
167  else if( header_name == '!OUTPUT_SSTYPE' ) then
168  call fstr_setup_output_sstype( ctrl, p )
169  else if( header_name == '!INITIAL_CONDITION' ) then
170  c_initial = c_initial + 1
171  else if( header_name == '!AMPLITUDE' ) then
172  c_amplitude = c_amplitude + 1
173  call fstr_setup_amplitude( ctrl, p )
174  else if( header_name == '!ELEMENT_ACTIVATION' ) then
175  c_elemact = c_elemact + 1
176  call fstr_setup_element_activation( ctrl, c_elemact, p )
177 
178  !--------------- for static -------------------------
179 
180  else if( header_name == '!STATIC' ) then
181  c_static = c_static + 1
182  call fstr_setup_static( ctrl, c_static, p )
183  else if( header_name == '!BOUNDARY' ) then
184  c_boundary = c_boundary + 1
185  call fstr_setup_boundary( ctrl, c_boundary, p )
186  else if( header_name == '!CLOAD' ) then
187  c_cload = c_cload + 1
188  call fstr_setup_cload( ctrl, c_cload, p )
189  n = fstr_ctrl_get_data_line_n( ctrl )
190  else if( header_name == '!DLOAD' ) then
191  c_dload = c_dload + 1
192  call fstr_setup_dload( ctrl, c_dload, p )
193  else if( header_name == '!CONTACT_ALGO' ) then
194  call fstr_setup_contactalgo( ctrl, p )
195  else if( header_name == '!CONTACT' ) then
196  n = fstr_ctrl_get_data_line_n( ctrl )
197  c_contact = c_contact + n
198  else if( header_name == '!EMBED' ) then
199  n = fstr_ctrl_get_data_line_n( ctrl )
200  c_embed = c_embed + n
201  else if( header_name == '!CONTACT_PARAM' ) then
202  c_contactparam = c_contactparam + 1
203  else if( header_name == '!CONTACT_INTERFERENCE' ) then
204  n = fstr_ctrl_get_data_line_n( ctrl )
205  c_contact_if = c_contact_if + n
206  else if( header_name == '!MATERIAL' ) then
207  c_material = c_material + 1
208  else if( header_name == '!TEMPERATURE' ) then
209  c_temperature = c_temperature + 1
210  call fstr_setup_temperature( ctrl, c_temperature, p )
211  else if( header_name == '!SPRING' ) then
212  c_spring = c_spring + 1
213  call fstr_setup_spring( ctrl, c_spring, p )
214  else if( header_name == '!REFTEMP' ) then
215  c_reftemp = c_reftemp + 1
216  call fstr_setup_reftemp( ctrl, c_reftemp, p )
217 
218  !--------------- for heat -------------------------
219 
220  else if( header_name == '!HEAT' ) then
221  c_heat = c_heat + 1
222  else if( header_name == '!FIXTEMP' ) then
223  c_fixtemp = c_fixtemp + 1
224  call fstr_setup_fixtemp( ctrl, c_fixtemp, p )
225  else if( header_name == '!CFLUX' ) then
226  c_cflux = c_cflux + 1
227  call fstr_setup_cflux( ctrl, c_cflux, p )
228  else if( header_name == '!DFLUX' ) then
229  c_dflux = c_dflux + 1
230  call fstr_setup_dflux( ctrl, c_dflux, p )
231  else if( header_name == '!SFLUX' ) then
232  c_sflux = c_sflux + 1
233  call fstr_setup_sflux( ctrl, c_sflux, p )
234  else if( header_name == '!FILM' ) then
235  c_film = c_film + 1
236  call fstr_setup_film( ctrl, c_film, p )
237  else if( header_name == '!SFILM' ) then
238  c_sfilm = c_sfilm + 1
239  call fstr_setup_sfilm( ctrl, c_sfilm, p )
240  else if( header_name == '!RADIATE' ) then
241  c_radiate = c_radiate + 1
242  call fstr_setup_radiate( ctrl, c_radiate, p )
243  else if( header_name == '!SRADIATE' ) then
244  c_sradiate = c_sradiate + 1
245  call fstr_setup_sradiate( ctrl, c_sradiate, p )
246  else if( header_name == '!WELD_LINE' ) then
247  c_weldline = c_weldline + 1
248 
249  !--------------- for eigen -------------------------
250 
251  else if( header_name == '!EIGEN' ) then
252  c_eigen = c_eigen + 1
253  call fstr_setup_eigen( ctrl, c_eigen, p )
254 
255  !--------------- for dynamic -------------------------
256 
257  else if( header_name == '!DYNAMIC' ) then
258  c_dynamic = c_dynamic + 1
259  call fstr_setup_dynamic( ctrl, c_eigen, p )
260  else if( header_name == '!VELOCITY' ) then
261  c_velocity = c_velocity + 1
262  call fstr_setup_velocity( ctrl, c_eigen, p )
263  else if( header_name == '!ACCELERATION' ) then
264  c_acceleration = c_acceleration + 1
265  call fstr_setup_acceleration( ctrl, c_eigen, p )
266  else if( header_name == '!FLOAD' ) then
267  c_fload = c_fload + 1
268  call fstr_setup_fload( ctrl , c_fload, p )
269  else if( header_name == '!EIGENREAD' ) then
270  c_eigenread = c_eigenread + 1
271  call fstr_setup_eigenread( ctrl, c_eigenread, p )
272 
273  !--------------- for couple -------------------------
274 
275  else if( header_name == '!COUPLE' ) then
276  c_couple = c_couple + 1
277  call fstr_setup_couple( ctrl, c_couple, p )
278 
279  !--------------- for mpc -------------------------
280 
281  else if( header_name == '!MPC' ) then
282  c_mpc = c_mpc + 1
283  call fstr_setup_mpc( ctrl, c_mpc, p )
284 
285  !--------------------- for input -------------------------
286 
287  else if( header_name == '!INCLUDE' ) then
288  ctrl_list(ictrl) = ctrl
289  input_filename = ""
290  ierror = fstr_ctrl_get_param_ex( ctrl, 'INPUT ', '# ', 0, 'S', input_filename )
291  ctrl = fstr_ctrl_open( input_filename )
292  if( ctrl < 0 ) then
293  write(*,*) '### Error: Cannot open FSTR control file : ', input_filename
294  write(ilog,*) '### Error: Cannot open FSTR control file : ', input_filename
295  stop
296  end if
297  ictrl = ictrl + 1
298  cycle
299 
300  !--------------------- END -------------------------
301 
302  else if( header_name == '!END' ) then
303  exit
304  end if
305 
306  ! next
307  if( fstr_ctrl_seek_next_header(ctrl) == 0 )then
308  if( ictrl == 1 )then
309  exit
310  else
311  ierror= fstr_ctrl_close( ctrl )
312  ictrl = ictrl - 1
313  ctrl = ctrl_list(ictrl)
314  if( fstr_ctrl_seek_next_header(ctrl) == 0 ) exit
315  endif
316  endif
317  end do
318 
319  ! -----
320  fstrsolid%n_contacts = c_contact
321  if( c_contact>0 ) then
322  allocate( fstrsolid%contacts( c_contact ) )
323  ! convert SURF_SURF contact to NODE_SURF contact
324  call fstr_convert_contact_type( p%MESH )
325  endif
326  fstrsolid%n_embeds = c_embed
327  if( c_embed>0 ) allocate( fstrsolid%embeds( c_embed ) )
328  if( c_weldline>0 ) allocate( fstrheat%weldline( c_weldline ) )
329  if( c_initial>0 ) allocate( g_initialcnd( c_initial ) )
330  if( c_istep>0 ) allocate( fstrsolid%step_ctrl( c_istep ) )
331  if( c_localcoord>0 ) allocate( g_localcoordsys(c_localcoord) )
332  allocate( fstrparam%ainc(0:c_aincparam) )
333  do i=0,c_aincparam
334  call init_aincparam( fstrparam%ainc(i) )
335  end do
336  if( c_timepoints>0 ) allocate( fstrparam%timepoints(c_timepoints) )
337  allocate( fstrparam%contactparam(0:c_contactparam) )
338  do i=0,c_contactparam
339  call init_contactparam( fstrparam%contactparam(i) )
340  end do
341  if( c_contact_if>0 )then
342  allocate( fstrparam%contact_if( c_contact_if ) )
343  do i=1,c_contact_if
344  call init_contact_if( fstrparam%contact_if(i) )
345  end do
346  end if
347 
348  p%SOLID%is_33shell = 0
349  p%SOLID%is_33beam = 0
350 
351  do i=1,hecmesh%n_elem_type
352  n = hecmesh%elem_type_item(i)
353  if (n == 781 .or. n == 761)then
354  p%SOLID%is_33shell = 1
355  elseif (n == 641)then
356  p%SOLID%is_33beam = 1
357  endif
358  enddo
359 
360  n = c_material
361  if( hecmesh%material%n_mat>n ) n= hecmesh%material%n_mat
362  if( n==0 ) stop "material property not defined!"
363  allocate( fstrsolid%materials( n ) )
364  do i = 1, n
365  call initmaterial(fstrsolid%materials(i))
366  enddo
367  if( hecmesh%section%n_sect >0 ) then
368  do i=1,hecmesh%section%n_sect
369  if( hecmesh%section%sect_type(i) == 4 ) cycle
370  cid = hecmesh%section%sect_mat_ID_item(i)
371  if( cid>n ) stop "Error in material property definition!"
372  if( fstrparam%nlgeom .or. fstrparam%solution_type==kststaticeigen ) &
373  fstrsolid%materials(cid)%nlgeom_flag = 1
374  nullify(shmat)
375  call fstr_get_prop(hecmesh,shmat,i,ee,pp,rho,alpha,thick,&
376  n_totlyr,alpha_over_mu, &
377  beam_radius,beam_angle1,beam_angle2,beam_angle3, &
378  beam_angle4,beam_angle5,beam_angle6)
379  fstrsolid%materials(cid)%name = hecmesh%material%mat_name(cid)
380  fstrsolid%materials(cid)%variables(m_youngs)=ee
381  fstrsolid%materials(cid)%variables(m_poisson)=pp
382  fstrsolid%materials(cid)%variables(m_density)=rho
383  fstrsolid%materials(cid)%variables(m_exapnsion)=alpha
384  fstrsolid%materials(cid)%variables(m_thick)=thick
385  fstrsolid%materials(cid)%variables(m_alpha_over_mu)= alpha_over_mu
386  fstrsolid%materials(cid)%variables(m_beam_radius)=beam_radius
387  fstrsolid%materials(cid)%variables(m_beam_angle1)=beam_angle1
388  fstrsolid%materials(cid)%variables(m_beam_angle2)=beam_angle2
389  fstrsolid%materials(cid)%variables(m_beam_angle3)=beam_angle3
390  fstrsolid%materials(cid)%variables(m_beam_angle4)=beam_angle4
391  fstrsolid%materials(cid)%variables(m_beam_angle5)=beam_angle5
392  fstrsolid%materials(cid)%variables(m_beam_angle6)=beam_angle6
393  fstrsolid%materials(cid)%mtype = elastic
394  fstrsolid%materials(cid)%totallyr = n_totlyr
395  fstrsolid%materials(cid)%shell_var => shmat
396  enddo
397  endif
398 
399  ! for section control
400  allocate( fstrsolid%sections(hecmesh%section%n_sect) )
401  do i=1,hecmesh%section%n_sect
402  ! set default 361 element formulation
403  if( p%PARAM%solution_type==kststatic .or. p%PARAM%solution_type==kstdynamic ) then
404  if( p%PARAM%nlgeom ) then
405  fstrsolid%sections(i)%elemopt361 = kel361fbar
406  else
407  fstrsolid%sections(i)%elemopt361 = kel361ic
408  end if
409  else if( p%PARAM%solution_type==ksteigen ) then
410  fstrsolid%sections(i)%elemopt361 = kel361ic
411  else if( p%PARAM%solution_type==kststaticeigen ) then
412  fstrsolid%sections(i)%elemopt361 = kel361fbar
413  else
414  fstrsolid%sections(i)%elemopt361 = kel361fi
415  end if
416  fstrsolid%sections(i)%elemopt341 = kel341fi
417  enddo
418 
419  allocate( fstrsolid%output_ctrl( 4 ) )
420  call fstr_init_outctrl(fstrsolid%output_ctrl(1))
421  fstrsolid%output_ctrl( 1 )%filename = trim(logfilename)
422  fstrsolid%output_ctrl( 1 )%filenum = ilog
423  call fstr_init_outctrl(fstrsolid%output_ctrl(2))
424  call fstr_init_outctrl(fstrsolid%output_ctrl(3))
425  call fstr_init_outctrl(fstrsolid%output_ctrl(4))
426 
427  ! -----
428  rcode = fstr_ctrl_rewind( ctrl )
429 
430  c_istep = 0
431  c_heat = 0
432  c_material = 0
433  c_output = 0
434  c_contact = 0
435  c_contactparam = 0
436  c_contact_if = 0
437  c_embed = 0
438  c_initial = 0
439  c_localcoord = 0
440  c_section = 0
441  fstrheat%WL_tot = 0
442  c_elemopt = 0
443  c_aincparam = 0
444  c_timepoints = 0
445  fstrsolid%elemopt361 = 0
446  fstrsolid%AutoINC_stat = 0
447  fstrsolid%CutBack_stat = 0
448  fstrsolid%NRstat_i(:) = 0
449  fstrsolid%NRstat_r(:) = 0.d0
450  ictrl = 1
451  do
452  rcode = fstr_ctrl_get_c_h_name( ctrl, header_name, hecmw_name_len )
453 
454  if( header_name == '!ORIENTATION' ) then
455  c_localcoord = c_localcoord + 1
456  if( fstr_setup_orientation( ctrl, hecmesh, c_localcoord, g_localcoordsys(c_localcoord) )/=0 ) then
457  write(*,*) '### Error: Fail in read in ORIENTATION definition : ', c_localcoord
458  write(ilog,*) '### Error: Fail in read in ORIENTATION definition : ', c_localcoord
459  stop
460  endif
461 
462  ! ----- CONTACT condition setting
463  elseif( header_name == '!CONTACT' ) then
464  n = fstr_ctrl_get_data_line_n( ctrl )
465  if( .not. fstr_ctrl_get_contact( ctrl, n, fstrsolid%contacts(c_contact+1:c_contact+n) &
466  ,ee, pp, rho, alpha, p%PARAM%contact_algo, mname ) ) then
467  write(*,*) '### Error: Fail in read in contact condition : ', c_contact
468  write(ilog,*) '### Error: Fail in read in contact condition : ', c_contact
469  stop
470  endif
471  cparam_id = 0
472  do i=1,size(fstrparam%contactparam)-1
473  if( fstr_streqr( fstrparam%contactparam(i)%name, mname ) ) then
474  cparam_id = i; exit
475  endif
476  enddo
477  ! initialize contact condition
478  if( ee>0.d0 ) cdotp = ee
479  if( pp>0.d0 ) mut = pp
480  if( rho>0.d0 ) cgn = rho
481  if( alpha>0.d0 ) cgt = alpha
482  do i=1,n
483  if( .not. fstr_contact_check( fstrsolid%contacts(c_contact+i), p%MESH ) ) then
484  write(*,*) '### Error: Inconsistence in contact and surface definition : ' , i+c_contact
485  write(ilog,*) '### Error: Inconsistence in contact and surface definition : ', i+c_contact
486  stop
487  else
488  if(paracontactflag) then
489  isok = fstr_contact_init( fstrsolid%contacts(c_contact+i), p%MESH, fstrparam%contactparam(cparam_id), myrank)
490  else
491  isok = fstr_contact_init( fstrsolid%contacts(c_contact+i), p%MESH, fstrparam%contactparam(cparam_id))
492  endif
493  ! call fstr_write_contact( 6, fstrSOLID%contacts(c_contact+i) )
494  endif
495  enddo
496  c_contact = c_contact+n
497 
498  ! ----- EMBED condition setting
499  elseif( header_name == '!EMBED' ) then
500  n = fstr_ctrl_get_data_line_n( ctrl )
501  if( .not. fstr_ctrl_get_embed( ctrl, n, fstrsolid%embeds(c_embed+1:c_embed+n), mname ) ) then
502  write(*,*) '### Error: Fail in read in embed condition : ', c_embed
503  write(ilog,*) '### Error: Fail in read in embed condition : ', c_embed
504  stop
505  endif
506  cparam_id = 0
507  do i=1,size(fstrparam%contactparam)-1
508  if( fstr_streqr( fstrparam%contactparam(i)%name, mname ) ) then
509  cparam_id = i; exit
510  endif
511  enddo
512  do i=1,n
513  if( .not. fstr_contact_check( fstrsolid%embeds(c_embed+i), p%MESH ) ) then
514  write(*,*) '### Error: Inconsistence in contact and surface definition : ' , i+c_embed
515  write(ilog,*) '### Error: Inconsistence in contact and surface definition : ', i+c_embed
516  stop
517  else
518  if(paracontactflag) then
519  isok = fstr_embed_init( fstrsolid%embeds(c_embed+i), p%MESH, fstrparam%contactparam(cparam_id), myrank)
520  else
521  isok = fstr_embed_init( fstrsolid%embeds(c_embed+i), p%MESH, fstrparam%contactparam(cparam_id))
522  endif
523  endif
524  enddo
525  c_embed = c_embed+n
526 
527  else if( header_name == '!ISTEP' ) then
528  c_istep = c_istep+1
529  if( .not. fstr_ctrl_get_istep( ctrl, hecmesh, fstrsolid%step_ctrl(c_istep), mname, mname2 ) ) then
530  write(*,*) '### Error: Fail in read in step definition : ' , c_istep
531  write(ilog,*) '### Error: Fail in read in step definition : ', c_istep
532  stop
533  endif
534  if( associated(fstrparam%timepoints) ) then
535  do i=1,size(fstrparam%timepoints)
536  if( fstr_streqr( fstrparam%timepoints(i)%name, mname ) ) then
537  fstrsolid%step_ctrl(c_istep)%timepoint_id = i; exit
538  endif
539  enddo
540  endif
541  if( associated(fstrparam%ainc) ) then
542  do i=1,size(fstrparam%ainc)
543  if( fstr_streqr( fstrparam%ainc(i)%name, mname2 ) ) then
544  fstrsolid%step_ctrl(c_istep)%AincParam_id = i; exit
545  endif
546  enddo
547  endif
548  else if( header_name == '!STEP' .and. version>=1 ) then
549  c_istep = c_istep+1
550  if( .not. fstr_ctrl_get_istep( ctrl, hecmesh, fstrsolid%step_ctrl(c_istep), mname, mname2 ) ) then
551  write(*,*) '### Error: Fail in read in step definition : ' , c_istep
552  write(ilog,*) '### Error: Fail in read in step definition : ', c_istep
553  stop
554  endif
555  if( associated(fstrparam%timepoints) ) then
556  do i=1,size(fstrparam%timepoints)
557  if( fstr_streqr( fstrparam%timepoints(i)%name, mname ) ) then
558  fstrsolid%step_ctrl(c_istep)%timepoint_id = i; exit
559  endif
560  enddo
561  endif
562  if( associated(fstrparam%ainc) ) then
563  do i=1,size(fstrparam%ainc)-1
564  if( fstr_streqr( fstrparam%ainc(i)%name, mname2 ) ) then
565  fstrsolid%step_ctrl(c_istep)%AincParam_id = i; exit
566  endif
567  enddo
568  endif
569 
570  else if( header_name == '!HEAT' ) then
571  c_heat = c_heat + 1
572  call fstr_setup_heat( ctrl, c_heat, p )
573 
574  else if( header_name == '!WELD_LINE' ) then
575  fstrheat%WL_tot = fstrheat%WL_tot+1
576  if( fstr_ctrl_get_weldline( ctrl, hecmesh, hecmw_name_len, fstrheat%weldline(fstrheat%WL_tot) )/=0 ) then
577  write(*,*) '### Error: Fail in read in Weld Line definition : ' , fstrheat%WL_tot
578  write(ilog,*) '### Error: Fail in read in Weld Line definition : ', fstrheat%WL_tot
579  stop
580  endif
581 
582  else if( header_name == '!INITIAL_CONDITION' .or. header_name == '!INITIAL CONDITION' ) then
583  c_initial = c_initial+1
584  if( fstr_setup_initial( ctrl, g_initialcnd(c_initial), p%MESH )/=0 ) then
585  write(*,*) '### Error: Fail in read in INITIAL CONDITION definition : ' ,c_initial
586  write(ilog,*) '### Error: Fail in read in INITIAL CONDITION definition : ', c_initial
587  stop
588  endif
589 
590  else if( header_name == '!SECTION' ) then
591  c_section = c_section+1
592  if( fstr_ctrl_get_section( ctrl, hecmesh, fstrsolid%sections )/=0 ) then
593  write(*,*) '### Error: Fail in read in SECTION definition : ' , c_section
594  write(ilog,*) '### Error: Fail in read in SECTION definition : ', c_section
595  stop
596  endif
597 
598  else if( header_name == '!ELEMOPT' ) then
599  c_elemopt = c_elemopt+1
600  if( fstr_ctrl_get_elemopt( ctrl, fstrsolid%elemopt361 )/=0 ) then
601  write(*,*) '### Error: Fail in read in ELEMOPT definition : ' , c_elemopt
602  write(ilog,*) '### Error: Fail in read in ELEMOPT definition : ', c_elemopt
603  stop
604  endif
605 
606  !== following material properties ==
607  else if( header_name == '!MATERIAL' ) then
608  c_material = c_material+1
609  if( fstr_ctrl_get_material( ctrl, mname )/=0 ) then
610  write(*,*) '### Error: Fail in read in material definition : ' , c_material
611  write(ilog,*) '### Error: Fail in read in material definition : ', c_material
612  stop
613  endif
614  cid = 0
615  if(cache < hecmesh%material%n_mat) then
616  if(fstr_streqr( hecmesh%material%mat_name(cache), mname ))then
617  cid = cache
618  cache = cache + 1
619  endif
620  endif
621  if(cid == 0)then
622  do i=1,hecmesh%material%n_mat
623  if( fstr_streqr( hecmesh%material%mat_name(i), mname ) ) then
624  cid = i
625  cache = i + 1
626  exit
627  endif
628  enddo
629  endif
630  if(cid == 0)then
631  write(*,*) '### Error: Fail in read in material definition : ' , c_material
632  write(ilog,*) '### Error: Fail in read in material definition : ', c_material
633  stop
634  endif
635  fstrsolid%materials(cid)%name = mname
636  if(c_material>hecmesh%material%n_mat) call initmaterial( fstrsolid%materials(cid) )
637 
638  else if( header_name == '!ELASTIC' ) then
639  if( c_material >0 ) then
640  if( fstr_ctrl_get_elasticity( ctrl, &
641  fstrsolid%materials(cid)%mtype, &
642  fstrsolid%materials(cid)%nlgeom_flag, &
643  fstrsolid%materials(cid)%variables, &
644  fstrsolid%materials(cid)%dict)/=0 ) then
645  write(*,*) '### Error: Fail in read in elasticity definition : ' , cid
646  write(ilog,*) '### Error: Fail in read in elasticity definition : ', cid
647  stop
648  endif
649  endif
650  else if( header_name == '!PLASTIC' ) then
651  if( cid >0 ) then
652  if( fstr_ctrl_get_plasticity( ctrl, &
653  fstrsolid%materials(cid)%mtype, &
654  fstrsolid%materials(cid)%nlgeom_flag, &
655  fstrsolid%materials(cid)%variables, &
656  fstrsolid%materials(cid)%table, &
657  fstrsolid%materials(cid)%dict)/=0 ) then
658  write(*,*) '### Error: Fail in read in plasticity definition : ' , cid
659  write(ilog,*) '### Error: Fail in read in plasticity definition : ', cid
660  stop
661  endif
662  endif
663  else if( header_name == '!HYPERELASTIC' ) then
664  if( cid >0 ) then
665  if( fstr_ctrl_get_hyperelastic( ctrl, &
666  fstrsolid%materials(cid)%mtype, &
667  fstrsolid%materials(cid)%nlgeom_flag, &
668  fstrsolid%materials(cid)%variables )/=0 ) then
669  write(*,*) '### Error: Fail in read in elasticity definition : ' , cid
670  write(ilog,*) '### Error: Fail in read in elasticity definition : ', cid
671  stop
672  endif
673  endif
674  else if( header_name == '!VISCOELASTIC' ) then
675  if( cid >0 ) then
676  if( fstr_ctrl_get_viscoelasticity( ctrl, &
677  fstrsolid%materials(cid)%mtype, &
678  fstrsolid%materials(cid)%nlgeom_flag, &
679  fstrsolid%materials(cid)%dict)/=0 ) then
680  write(*,*) '### Error: Fail in read in plasticity definition : ' , cid
681  write(ilog,*) '### Error: Fail in read in plasticity definition : ', cid
682  stop
683  endif
684  endif
685  else if( header_name == '!TRS' ) then
686  if( cid >0 ) then
687  if( fstrsolid%materials(cid)%mtype/=viscoelastic ) then
688  write(*,*) '### WARNING: TRS can only be defined for viscoelastic material! It is ignored! '
689  write(ilog,*) '### WARNING: TRS can only be defined for viscoelastic material! It is ignored! '
690  else
691  if( fstr_ctrl_get_trs( ctrl, fstrsolid%materials(cid)%mtype, fstrsolid%materials(cid)%variables)/=0 ) then
692  write(*,*) '### Error: Fail in read in TRS definition : ' , cid
693  write(ilog,*) '### Error: Fail in read in TRS definition : ', cid
694  stop
695  endif
696  endif
697  endif
698  else if( header_name == '!CREEP' ) then
699  if( cid >0 ) then
700  if( fstr_ctrl_get_viscoplasticity( ctrl, &
701  fstrsolid%materials(cid)%mtype, &
702  fstrsolid%materials(cid)%nlgeom_flag, &
703  fstrsolid%materials(cid)%dict)/=0 ) then
704  write(*,*) '### Error: Fail in read in plasticity definition : ' , cid
705  write(ilog,*) '### Error: Fail in read in plasticity definition : ', cid
706  stop
707  endif
708  endif
709  else if( header_name == '!DENSITY' ) then
710  if( cid >0 ) then
711  if( fstr_ctrl_get_density( ctrl, fstrsolid%materials(cid)%variables )/=0 ) then
712  write(*,*) '### Error: Fail in read in density definition : ' , cid
713  write(ilog,*) '### Error: Fail in read in density definition : ', cid
714  stop
715  endif
716  endif
717  else if( header_name == '!EXPANSION_COEF' .or. header_name == '!EXPANSION_COEFF' .or. &
718  header_name == '!EXPANSION') then
719  if( cid >0 ) then
720  if( fstr_ctrl_get_expansion_coeff( ctrl, fstrsolid%materials(cid)%variables, &
721  fstrsolid%materials(cid)%dict)/=0 ) then
722  write(*,*) '### Error: Fail in read in expansion coefficient definition : ' , cid
723  write(ilog,*) '### Error: Fail in read in expansion coefficient definition : ', cid
724  stop
725  endif
726  endif
727  else if( header_name == '!FLUID' ) then
728  if( c_material >0 ) then
729  if( fstr_ctrl_get_fluid( ctrl, &
730  fstrsolid%materials(cid)%mtype, &
731  fstrsolid%materials(cid)%nlgeom_flag, &
732  fstrsolid%materials(cid)%variables, &
733  fstrsolid%materials(cid)%dict)/=0 ) then
734  write(*,*) '### Error: Fail in read in fluid definition : ' , cid
735  write(ilog,*) '### Error: Fail in read in fluid definition : ', cid
736  stop
737  endif
738  endif
739  else if( header_name == '!SPRING_D' ) then
740  if( c_material >0 ) then
741  if( fstr_ctrl_get_spring_d( ctrl, &
742  fstrsolid%materials(cid)%mtype, &
743  fstrsolid%materials(cid)%nlgeom_flag, &
744  fstrsolid%materials(cid)%variables_i, &
745  fstrsolid%materials(cid)%dict)/=0 ) then
746  write(*,*) '### Error: Fail in read in spring_d definition : ' , cid
747  write(ilog,*) '### Error: Fail in read in spring_d definition : ', cid
748  stop
749  endif
750  endif
751  else if( header_name == '!SPRING_A' ) then
752  if( c_material >0 ) then
753  if( fstr_ctrl_get_spring_a( ctrl, &
754  fstrsolid%materials(cid)%mtype, &
755  fstrsolid%materials(cid)%nlgeom_flag, &
756  fstrsolid%materials(cid)%variables_i, &
757  fstrsolid%materials(cid)%dict)/=0 ) then
758  write(*,*) '### Error: Fail in read in spring_a definition : ' , cid
759  write(ilog,*) '### Error: Fail in read in spring_a definition : ', cid
760  stop
761  endif
762  endif
763  else if( header_name == '!DASHPOT_D' ) then
764  if( c_material >0 ) then
765  if( fstr_ctrl_get_dashpot_d( ctrl, &
766  fstrsolid%materials(cid)%mtype, &
767  fstrsolid%materials(cid)%nlgeom_flag, &
768  fstrsolid%materials(cid)%variables_i, &
769  fstrsolid%materials(cid)%dict)/=0 ) then
770  write(*,*) '### Error: Fail in read in spring_d definition : ' , cid
771  write(ilog,*) '### Error: Fail in read in spring_d definition : ', cid
772  stop
773  endif
774  endif
775  else if( header_name == '!DASHPOT_A' ) then
776  if( c_material >0 ) then
777  if( fstr_ctrl_get_dashpot_a( ctrl, &
778  fstrsolid%materials(cid)%mtype, &
779  fstrsolid%materials(cid)%nlgeom_flag, &
780  fstrsolid%materials(cid)%variables_i, &
781  fstrsolid%materials(cid)%dict)/=0 ) then
782  write(*,*) '### Error: Fail in read in spring_a definition : ' , cid
783  write(ilog,*) '### Error: Fail in read in spring_a definition : ', cid
784  stop
785  endif
786  endif
787  else if( header_name == '!USER_MATERIAL' ) then
788  if( cid >0 ) then
789  if( fstr_ctrl_get_usermaterial( ctrl, fstrsolid%materials(cid)%mtype, &
790  fstrsolid%materials(cid)%nlgeom_flag, fstrsolid%materials(cid)%nfstatus, &
791  fstrsolid%materials(cid)%variables(101:) )/=0 ) then
792  write(*,*) '### Error: Fail in read in user defined material : ' , cid
793  write(ilog,*) '### Error: Fail in read in user defined material : ', cid
794  stop
795  endif
796  endif
797 
798 
799  ! == Following output control ==
800  else if( header_name == '!WRITE' ) then
801  call fstr_ctrl_get_output( ctrl, outctrl, islog, result, visual, femap )
802  if( islog == 1 ) then
803  c_output=1
804  outctrl%filename = trim(logfilename)
805  outctrl%filenum = ilog
806  call fstr_copy_outctrl(fstrsolid%output_ctrl(c_output), outctrl)
807  endif
808  if( femap == 1 ) then
809  c_output=2
810  write( outctrl%filename, *) 'utable.',myrank,".dat"
811  outctrl%filenum = iutb
812  call fstr_copy_outctrl(fstrsolid%output_ctrl(c_output), outctrl)
813  open( unit=outctrl%filenum, file=outctrl%filename, status='REPLACE' )
814  endif
815  if( result == 1 ) then
816  c_output=3
817  call fstr_copy_outctrl(fstrsolid%output_ctrl(c_output), outctrl)
818  endif
819  if( visual == 1 ) then
820  c_output=4
821  call fstr_copy_outctrl(fstrsolid%output_ctrl(c_output), outctrl)
822  endif
823 
824  else if( header_name == '!OUTPUT_RES' ) then
825  c_output=3
826  if( .not. fstr_ctrl_get_outitem( ctrl, hecmesh, fstrsolid%output_ctrl(c_output)%outinfo ) ) then
827  write(*,*) '### Error: Fail in read in node output definition : ' , c_output
828  write(ilog,*) '### Error: Fail in read in node output definition : ', c_output
829  stop
830  endif
831  if( fstrsolid%output_ctrl(c_output)%outinfo%grp_id_name /= 'ALL' ) then
832  c_output=2
833  do i=1,hecmesh%node_group%n_grp
834  if( fstrsolid%output_ctrl(c_output)%outinfo%grp_id_name == hecmesh%node_group%grp_name(i) ) then
835  fstrsolid%output_ctrl(c_output)%outinfo%grp_id = i; exit
836  endif
837  enddo
838  endif
839  else if( header_name == '!OUTPUT_VIS' ) then
840  c_output=4
841  if( .not. fstr_ctrl_get_outitem( ctrl, hecmesh, fstrsolid%output_ctrl(c_output)%outinfo ) ) then
842  write(*,*) '### Error: Fail in read in element output definition : ' , c_output
843  write(ilog,*) '### Error: Fail in read in element output definition : ', c_output
844  stop
845  endif
846  if( fstrsolid%output_ctrl(c_output)%outinfo%grp_id_name /= 'ALL' ) then
847  c_output=2
848  do i=1,hecmesh%node_group%n_grp
849  if( fstrsolid%output_ctrl(c_output)%outinfo%grp_id_name == hecmesh%node_group%grp_name(i) ) then
850  fstrsolid%output_ctrl(c_output)%outinfo%grp_id = i; exit
851  endif
852  enddo
853  endif
854  else if( header_name == '!AUTOINC_PARAM' ) then
855  c_aincparam = c_aincparam + 1
856  if( fstr_get_autoinc( ctrl, fstrparam%ainc(c_aincparam) ) /=0 ) then
857  write(*,*) '### Error: Fail in read in AUTOINC_PARAM definition : ' , c_aincparam
858  write(ilog,*) '### Error: Fail in read in AUTOINC_PARAM definition : ', c_aincparam
859  stop
860  endif
861  else if( header_name == '!TIME_POINTS' ) then
862  c_timepoints = c_timepoints + 1
863  if( fstr_ctrl_get_timepoints( ctrl, fstrparam%timepoints(c_timepoints) )/=0 ) then
864  write(*,*) '### Error: Fail in read in TIME_POINTS definition : ' , c_timepoints
865  write(ilog,*) '### Error: Fail in read in TIME_POINTS definition : ', c_timepoints
866  stop
867  endif
868  else if( header_name == '!CONTACT_PARAM' ) then
869  c_contactparam = c_contactparam + 1
870  if( fstr_ctrl_get_contactparam( ctrl, fstrparam%contactparam(c_contactparam) ) /=0 ) then
871  write(*,*) '### Error: Fail in read in CONTACT_PARAM definition : ' , c_contactparam
872  write(ilog,*) '### Error: Fail in read in CONTACT_PARAM definition : ', c_contactparam
873  stop
874  endif
875  else if( header_name == '!CONTACT_INTERFERENCE' ) then
876  n = fstr_ctrl_get_data_line_n( ctrl )
877  if( fstr_ctrl_get_contact_if( ctrl, n, fstrparam%contact_if(c_contact_if+1:n+1) ) /= 0 ) then
878  write(*,*) '### Error: Fail in read in CONTACT_INTERFERENCE definition : ' , c_contact_if
879  write(ilog,*) '### Error: Fail in read in CONTACT_INTERFERENCE definition : ', c_contact_if
880  stop
881  endif
882  do i=1, n
883  if( check_apply_contact_if(fstrparam%contact_if(c_contact_if+i), fstrsolid%contacts) /= 0) then
884  write(*,*) '### Error:(INTERFERENCE) Inconsistence of contact_pair in CONTACTS: ' , i+c_contact_if
885  write(ilog,*) '### Error:(INTERFERENCE) Inconsistence of contact_pair in CONTACTS: ', i+c_contact_if
886  stop
887  end if
888  end do
889  c_contact_if = c_contact_if + n
890  else if( header_name == '!ULOAD' ) then
891  if( fstr_ctrl_get_userload( ctrl )/=0 ) then
892  write(*,*) '### Error: Fail in read in ULOAD definition : '
893  write(ilog,*) '### Error: Fail in read in ULOAD definition : '
894  stop
895  endif
896 
897  else if( header_name == '!INCLUDE' ) then
898  ctrl_list(ictrl) = ctrl
899  input_filename = ""
900  ierror = fstr_ctrl_get_param_ex( ctrl, 'INPUT ', '# ', 0, 'S', input_filename )
901  ctrl = fstr_ctrl_open( input_filename )
902  if( ctrl < 0 ) then
903  write(*,*) '### Error: Cannot open FSTR control file : ', input_filename
904  write(ilog,*) '### Error: Cannot open FSTR control file : ', input_filename
905  stop
906  end if
907  ictrl = ictrl + 1
908  cycle
909 
910  else if( header_name == '!END' ) then
911  exit
912  endif
913 
914  ! next
915  if( fstr_ctrl_seek_next_header(ctrl) == 0 )then
916  if( ictrl == 1 )then
917  exit
918  else
919  ierror= fstr_ctrl_close( ctrl )
920  ictrl = ictrl - 1
921  ctrl = ctrl_list(ictrl)
922  if( fstr_ctrl_seek_next_header(ctrl) == 0 ) exit
923  endif
924  endif
925 
926  end do
927 
928  ! ----- material type judgement. in case of infinitive analysis, nlgeom_flag=0
929  if( .not. p%PARAM%nlgeom ) then
930  do i=1, c_material
931  fstrsolid%materials(i)%nlgeom_flag = 0
932  enddo
933  endif
934 
935  if( fstrsolid%TEMP_ngrp_tot > 0 .or. fstrsolid%TEMP_irres > 0 ) then
936  allocate ( fstrsolid%temperature( hecmesh%n_node ) ,stat=ierror )
937  if( ierror /= 0 ) then
938  write(idbg,*) 'stop due to allocation error <FSTR_SOLID, TEMPERATURE>'
939  write(idbg,*) ' rank = ', myrank,' ierror = ',ierror
940  call flush(idbg)
941  call hecmw_abort( hecmw_comm_get_comm())
942  end if
943  fstrsolid%temperature = ref_temp
944  allocate ( fstrsolid%last_temp( hecmesh%n_node ) ,stat=ierror )
945  if( ierror /= 0 ) then
946  write(idbg,*) 'stop due to allocation error <FSTR_SOLID, LAST_TEMP>'
947  write(idbg,*) ' rank = ', myrank,' ierror = ',ierror
948  call flush(idbg)
949  call hecmw_abort( hecmw_comm_get_comm())
950  end if
951  fstrsolid%last_temp = 0.d0
952  allocate ( fstrsolid%temp_bak( hecmesh%n_node ) ,stat=ierror )
953  if( ierror /= 0 ) then
954  write(idbg,*) 'stop due to allocation error <FSTR_SOLID, TEMP_BAK>'
955  write(idbg,*) ' rank = ', myrank,' ierror = ',ierror
956  call flush(idbg)
957  call hecmw_abort( hecmw_comm_get_comm())
958  end if
959  fstrsolid%temp_bak = 0.d0
960  endif
961 
962  if( associated(fstrsolid%step_ctrl) ) then
963  fstrsolid%nstep_tot = size(fstrsolid%step_ctrl)
964  call setup_stepinfo_starttime( fstrsolid%step_ctrl )
965  !call fstr_print_steps( 6, fstrSOLID%step_ctrl )
966  else
967  if( p%PARAM%solution_type==kststatic .and. p%PARAM%nlgeom ) then
968  write( *,* ) " ERROR: STEP not defined!"
969  write( idbg,* ) "ERROR: STEP not defined!"
970  call flush(idbg)
971  call hecmw_abort( hecmw_comm_get_comm())
972  endif
973 
974  if( myrank==0 ) write(*,*)"Step control not defined! Using default step=1"
975  fstrsolid%nstep_tot = 1
976  allocate( fstrsolid%step_ctrl(1) )
977  call init_stepinfo( fstrsolid%step_ctrl(1) )
978  n = fstrsolid%BOUNDARY_ngrp_tot
979  if( n>0 ) allocate( fstrsolid%step_ctrl(1)%Boundary(n) )
980  do i = 1, n
981  fstrsolid%step_ctrl(1)%Boundary(i) = fstrsolid%BOUNDARY_ngrp_GRPID(i)
982  enddo
983  n = fstrsolid%CLOAD_ngrp_tot + fstrsolid%DLOAD_ngrp_tot + fstrsolid%TEMP_ngrp_tot + fstrsolid%SPRING_ngrp_tot
984  if( n>0 ) allocate( fstrsolid%step_ctrl(1)%Load(n) )
985  n = 0
986  do i = 1, fstrsolid%CLOAD_ngrp_tot
987  n = n + 1
988  fstrsolid%step_ctrl(1)%Load(n) = fstrsolid%CLOAD_ngrp_GRPID(i)
989  enddo
990  do i = 1, fstrsolid%DLOAD_ngrp_tot
991  n = n + 1
992  fstrsolid%step_ctrl(1)%Load(n) = fstrsolid%DLOAD_ngrp_GRPID(i)
993  enddo
994  do i = 1, fstrsolid%TEMP_ngrp_tot
995  n = n + 1
996  fstrsolid%step_ctrl(1)%Load(n) = fstrsolid%TEMP_ngrp_GRPID(i)
997  enddo
998  do i = 1, fstrsolid%SPRING_ngrp_tot
999  n = n + 1
1000  fstrsolid%step_ctrl(1)%Load(n) = fstrsolid%SPRING_ngrp_GRPID(i)
1001  enddo
1002  n = fstrsolid%elemact%ELEMACT_egrp_tot
1003  if( n>0 ) allocate( fstrsolid%step_ctrl(1)%ElemActivation(n) )
1004  do i = 1, n
1005  fstrsolid%step_ctrl(1)%ElemActivation(i) = fstrsolid%elemact%ELEMACT_egrp_GRPID(i)
1006  enddo
1007  endif
1008 
1009  call fstr_element_init( hecmesh, fstrsolid, p%PARAM%solution_type )
1010  if( p%PARAM%solution_type==kststatic .or. p%PARAM%solution_type==kstdynamic .or. &
1011  p%PARAM%solution_type==ksteigen .or. p%PARAM%solution_type==kststaticeigen ) &
1012  call fstr_solid_alloc( hecmesh, fstrsolid )
1013 
1014  if( p%PARAM%solution_type == kstheat) then
1015  p%PARAM%fg_irres = fstrsolid%output_ctrl(3)%frequency
1016  p%PARAM%fg_iwres = fstrsolid%output_ctrl(4)%frequency
1017  p%HEAT%elemact = p%SOLID%elemact
1018  endif
1019 
1020  n_totlyr = 1
1021  do i=1,hecmesh%section%n_sect
1022  cid = hecmesh%section%sect_mat_ID_item(i)
1023  n = fstrsolid%materials(cid)%totallyr
1024  if (n > n_totlyr)then
1025  n_totlyr = n
1026  endif
1027  enddo
1028  p%SOLID%max_lyr = n_totlyr
1029 
1030  call fstr_setup_post( ctrl, p )
1031  rcode = fstr_ctrl_close( ctrl )
1032 
1033  end subroutine fstr_setup
1034 
1035 
1037  subroutine fstr_solid_init( hecMESH, fstrSOLID )
1038  use m_fstr
1039  type(hecmwst_local_mesh),target :: hecMESH
1040  type(fstr_solid) :: fstrSOLID
1041 
1042  integer :: ndof, ntotal, ierror, ic_type
1043 
1044  fstrsolid%file_type = kbcffstr
1045 
1046  fstrsolid%BOUNDARY_ngrp_tot = 0
1047  fstrsolid%BOUNDARY_ngrp_rot = 0
1048  fstrsolid%CLOAD_ngrp_tot = 0
1049  fstrsolid%CLOAD_ngrp_rot = 0
1050  fstrsolid%DLOAD_ngrp_tot = 0
1051  fstrsolid%DLOAD_follow = 1
1052  fstrsolid%TEMP_ngrp_tot = 0
1053  fstrsolid%SPRING_ngrp_tot = 0
1054  fstrsolid%TEMP_irres = 0
1055  fstrsolid%TEMP_tstep = 1
1056  fstrsolid%TEMP_interval = 1
1057  fstrsolid%TEMP_rtype = 1
1058  fstrsolid%TEMP_factor = 1.d0
1059  fstrsolid%VELOCITY_ngrp_tot = 0
1060  fstrsolid%ACCELERATION_ngrp_tot = 0
1061  fstrsolid%COUPLE_ngrp_tot = 0
1062 
1063  fstrsolid%restart_nout= 0
1064  fstrsolid%is_smoothing_active = .false.
1065 
1066  end subroutine fstr_solid_init
1067 
1069  subroutine fstr_solid_alloc( hecMESH, fstrSOLID )
1070  use m_fstr
1071  type(hecmwst_local_mesh),target :: hecMESH
1072  type(fstr_solid) :: fstrSOLID
1073 
1074  integer :: ndof, ntotal, ierror, ic_type
1075 
1076  ndof=hecmesh%n_dof
1077  ntotal=ndof*hecmesh%n_node
1078 
1079  allocate ( fstrsolid%GL( ntotal ) ,stat=ierror )
1080  if( ierror /= 0 ) then
1081  write(idbg,*) 'stop due to allocation error <FSTR_SOLID, GL>'
1082  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1083  call flush(idbg)
1084  call hecmw_abort( hecmw_comm_get_comm())
1085  end if
1086  allocate ( fstrsolid%GL0( ntotal ) ,stat=ierror )
1087  if( ierror /= 0 ) then
1088  write(idbg,*) 'stop due to allocation error <FSTR_SOLID, GL0>'
1089  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1090  call flush(idbg)
1091  call hecmw_abort( hecmw_comm_get_comm())
1092  end if
1093  allocate ( fstrsolid%EFORCE( ntotal ) ,stat=ierror )
1094  if( ierror /= 0 ) then
1095  write(idbg,*) 'stop due to allocation error <FSTR_SOLID, EFORCE>'
1096  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1097  call flush(idbg)
1098  call hecmw_abort( hecmw_comm_get_comm())
1099  end if
1100  ! allocate ( fstrSOLID%TOTAL_DISP( ntotal ) ,STAT=ierror )
1101  ! if( ierror /= 0 ) then
1102  ! write(idbg,*) 'stop due to allocation error <FSTR_SOLID, TOTAL_DISP>'
1103  ! write(idbg,*) ' rank = ', hecMESH%my_rank,' ierror = ',ierror
1104  ! call flush(idbg)
1105  ! call hecmw_abort( hecmw_comm_get_comm())
1106  ! end if
1107  allocate ( fstrsolid%unode( ntotal ) ,stat=ierror )
1108  if( ierror /= 0 ) then
1109  write(idbg,*) 'stop due to allocation error <FSTR_SOLID, unode>'
1110  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1111  call flush(idbg)
1112  call hecmw_abort( hecmw_comm_get_comm())
1113  end if
1114  allocate ( fstrsolid%unode_bak( ntotal ) ,stat=ierror )
1115  if( ierror /= 0 ) then
1116  write(idbg,*) 'stop due to allocation error <FSTR_SOLID, unode>'
1117  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1118  call flush(idbg)
1119  call hecmw_abort( hecmw_comm_get_comm())
1120  end if
1121  allocate ( fstrsolid%dunode( ntotal ) ,stat=ierror )
1122  if( ierror /= 0 ) then
1123  write(idbg,*) 'stop due to allocation error <FSTR_SOLID, dunode>'
1124  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1125  call flush(idbg)
1126  call hecmw_abort( hecmw_comm_get_comm())
1127  end if
1128  allocate ( fstrsolid%ddunode( ntotal ) ,stat=ierror )
1129  if( ierror /= 0 ) then
1130  write(idbg,*) 'stop due to allocation error <FSTR_SOLID, ddunode>'
1131  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1132  call flush(idbg)
1133  call hecmw_abort( hecmw_comm_get_comm())
1134  end if
1135  allocate ( fstrsolid%QFORCE( ntotal ) ,stat=ierror )
1136  if( ierror /= 0 ) then
1137  write(idbg,*) 'stop due to allocation error <FSTR_SOLID, QFORCE>'
1138  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1139  call flush(idbg)
1140  call hecmw_abort( hecmw_comm_get_comm())
1141  end if
1142  allocate ( fstrsolid%QFORCE_bak( ntotal ) ,stat=ierror )
1143  if( ierror /= 0 ) then
1144  write(idbg,*) 'stop due to allocation error <FSTR_SOLID, QFORCE_bak>'
1145  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1146  call flush(idbg)
1147  call hecmw_abort( hecmw_comm_get_comm())
1148  end if
1149 
1150  fstrsolid%GL(:)=0.d0
1151  fstrsolid%GL0(:)=0.d0
1152  ! fstrSOLID%TOTAL_DISP(:)=0.d0
1153  fstrsolid%unode(:) = 0.d0
1154  fstrsolid%unode_bak(:) = 0.d0
1155  fstrsolid%dunode(:) = 0.d0
1156  fstrsolid%ddunode(:) = 0.d0
1157  fstrsolid%QFORCE(:) = 0.d0
1158  fstrsolid%QFORCE_bak(:) = 0.d0
1159  fstrsolid%FACTOR( 1:2 ) = 0.d0
1160 
1161  ! for MPC
1162  fstrsolid%n_fix_mpc = hecmesh%mpc%n_mpc
1163  if( fstrsolid%n_fix_mpc>0 ) then
1164  allocate( fstrsolid%mpc_const( fstrsolid%n_fix_mpc ) )
1165  fstrsolid%mpc_const(:) = hecmesh%mpc%mpc_const(:)
1166  endif
1167 
1168  ! initialize for linear static problems
1169  fstrsolid%FACTOR(2)=1.d0
1170  fstrsolid%FACTOR(1)=0.d0
1171  end subroutine fstr_solid_alloc
1172 
1173  subroutine fstr_smoothed_element_init( hecMESH, fstrSOLID )
1174  type(hecmwst_local_mesh),target :: hecMESH
1175  type(fstr_solid) :: fstrSOLID
1176 
1177  logical, allocatable :: is_selem_list(:)
1178  integer :: i, isect
1179 
1180  do isect=1,hecmesh%section%n_sect
1181  if( fstrsolid%sections(isect)%elemopt341 == kel341sesns ) fstrsolid%is_smoothing_active = .true.
1182  end do
1183  if( .not. fstrsolid%is_smoothing_active ) return
1184 
1185  allocate(is_selem_list(hecmesh%n_elem))
1186  is_selem_list(:) = .false.
1187 
1188  do i=1,hecmesh%n_elem
1189  isect= hecmesh%section_ID(i)
1190  if( hecmesh%elem_type(i) /= fe_tet4n ) cycle
1191  if( fstrsolid%sections(isect)%elemopt341 == kel341sesns ) is_selem_list(i) = .true.
1192  enddo
1193 
1194  call hecmw_create_smoothing_element_connectivity(hecmesh,is_selem_list)
1195 
1196  deallocate(is_selem_list)
1197 
1198  end subroutine
1199 
1200  subroutine fstr_smoothed_element_calcmaxcon( hecMESH, fstrSOLID )
1202  type(hecmwst_local_mesh),target :: hecMESH
1203  type(fstr_solid) :: fstrSOLID
1204 
1205  integer :: i, isect, nodlocal(fstrSOLID%max_ncon), iiS, nn, con_stf
1206 
1207  if( fstrsolid%max_ncon_stf > 20 ) fstrsolid%max_ncon_stf = 20
1208 
1209  do i=1,hecmesh%n_elem
1210  isect= hecmesh%section_ID(i)
1211  if( hecmesh%elem_type(i) /= fe_tet4n ) cycle
1212  if( fstrsolid%sections(isect)%elemopt341 /= kel341sesns ) cycle
1213  iis = hecmesh%elem_node_index(i-1)
1214  nn = hecmesh%elem_node_index(i-1) - iis
1215  nodlocal(1:nn) = hecmesh%elem_node_item(iis+1:iis+nn)
1216  con_stf = return_nn_comp_c3d4_sesns(nn, nodlocal)
1217  if( con_stf > fstrsolid%max_ncon_stf ) fstrsolid%max_ncon_stf = con_stf
1218  enddo
1219  end subroutine
1220 
1222  subroutine fstr_element_init( hecMESH, fstrSOLID, solution_type )
1223  use elementinfo
1224  use mmechgauss
1225  use m_fstr
1226  type(hecmwst_local_mesh),target :: hecMESH
1227  type(fstr_solid) :: fstrSOLID
1228  integer(kind=kint), intent(in) :: solution_type
1229 
1230  integer :: i, j, ng, isect, ndof, id, nn, n_elem
1231  integer :: ncon_stf
1232 
1233  if( hecmesh%n_elem <=0 ) then
1234  stop "no element defined!"
1235  endif
1236 
1237  fstrsolid%maxn_gauss = 0
1238  fstrsolid%max_ncon = 0
1239 
1240  ! elemopt341 = kel341ES
1241  call fstr_smoothed_element_init( hecmesh, fstrsolid )
1242 
1243  ! number of elements
1244  n_elem = hecmesh%elem_type_index(hecmesh%n_elem_type)
1245  allocate( fstrsolid%elements(n_elem) )
1246 
1247  do i=1,n_elem
1248  fstrsolid%elements(i)%elemact_flag = kelact_undefined
1249  if( solution_type == kstheat) cycle !fstrSOLID is used only for elemact element in heat transfer analysis
1250 
1251  fstrsolid%elements(i)%etype = hecmesh%elem_type(i)
1252  if( hecmesh%elem_type(i)==301 ) fstrsolid%elements(i)%etype=111
1253  if (hecmw_is_etype_link(fstrsolid%elements(i)%etype)) cycle
1254  if (hecmw_is_etype_patch(fstrsolid%elements(i)%etype)) cycle
1255  ng = numofquadpoints( fstrsolid%elements(i)%etype )
1256  if( ng > fstrsolid%maxn_gauss ) fstrsolid%maxn_gauss = ng
1257  if(ng>0) allocate( fstrsolid%elements(i)%gausses( ng ) )
1258 
1259  isect= hecmesh%section_ID(i)
1260  ndof = getspacedimension( fstrsolid%elements(i)%etype )
1261  if (ndof == 2) then ! why do this???
1262  id=hecmesh%section%sect_opt(isect)
1263  if( id==0 ) then
1264  fstrsolid%elements(i)%iset=1
1265  else if( id==1) then
1266  fstrsolid%elements(i)%iset=0
1267  else if( id==2) then
1268  fstrsolid%elements(i)%iset=2
1269  endif
1270  endif
1271 
1272  if( isect<0 .or. isect>hecmesh%section%n_sect ) &
1273  stop "Error in element's section definition"
1274  id = hecmesh%section%sect_mat_ID_item(isect)
1275  fstrsolid%materials(id)%cdsys_ID = hecmesh%section%sect_orien_ID(isect)
1276  do j=1,ng
1277  fstrsolid%elements(i)%gausses(j)%pMaterial => fstrsolid%materials(id)
1278  call fstr_init_gauss( fstrsolid%elements(i)%gausses( j ) )
1279  enddo
1280 
1281  nn = hecmesh%elem_node_index(i)-hecmesh%elem_node_index(i-1)
1282  allocate(fstrsolid%elements(i)%equiForces(nn*ndof))
1283  fstrsolid%elements(i)%equiForces = 0.0d0
1284  if( nn > fstrsolid%max_ncon ) fstrsolid%max_ncon = nn
1285 
1286  if( hecmesh%elem_type(i)==361 ) then
1287  if( fstrsolid%sections(isect)%elemopt361==kel361ic ) then
1288  allocate( fstrsolid%elements(i)%aux(3,3) )
1289  fstrsolid%elements(i)%aux = 0.0d0
1290  endif
1291  endif
1292 
1293  enddo
1294 
1295  fstrsolid%max_ncon_stf = fstrsolid%max_ncon
1296  if( fstrsolid%is_smoothing_active ) call fstr_smoothed_element_calcmaxcon( hecmesh, fstrsolid )
1297 
1298  call hecmw_allreduce_i1(hecmesh,fstrsolid%maxn_gauss,hecmw_max)
1299  end subroutine
1300 
1302  subroutine fstr_solid_finalize( fstrSOLID )
1303  type(fstr_solid) :: fstrSOLID
1304  integer :: i, j, ierror
1305  if( associated(fstrsolid%materials) ) then
1306  do j=1,size(fstrsolid%materials)
1307  call finalizematerial(fstrsolid%materials(j))
1308  enddo
1309  deallocate( fstrsolid%materials )
1310  endif
1311  if( .not. associated(fstrsolid%elements ) ) return
1312  do i=1,size(fstrsolid%elements)
1313  if( associated(fstrsolid%elements(i)%gausses) ) then
1314  do j=1,size(fstrsolid%elements(i)%gausses)
1315  call fstr_finalize_gauss(fstrsolid%elements(i)%gausses(j))
1316  enddo
1317  deallocate( fstrsolid%elements(i)%gausses )
1318  endif
1319  if(associated(fstrsolid%elements(i)%equiForces) ) then
1320  deallocate(fstrsolid%elements(i)%equiForces)
1321  endif
1322  if( associated(fstrsolid%elements(i)%aux) ) then
1323  deallocate(fstrsolid%elements(i)%aux)
1324  endif
1325  enddo
1326 
1327  deallocate( fstrsolid%elements )
1328  if( associated( fstrsolid%mpc_const ) ) then
1329  deallocate( fstrsolid%mpc_const )
1330  endif
1331  call free_stepinfo( fstrsolid%step_ctrl_restart )
1332  if( associated(fstrsolid%step_ctrl) ) then
1333  do i=1,size(fstrsolid%step_ctrl)
1334  call free_stepinfo( fstrsolid%step_ctrl(i) )
1335  enddo
1336  deallocate( fstrsolid%step_ctrl )
1337  endif
1338  if(associated(fstrsolid%output_ctrl) ) then
1339  do i=1,size(fstrsolid%output_ctrl)
1340  if( fstrsolid%output_ctrl(i)%filenum==iutb ) &
1341  close(fstrsolid%output_ctrl(i)%filenum)
1342  enddo
1343  deallocate(fstrsolid%output_ctrl)
1344  endif
1345  if( associated( fstrsolid%sections ) ) then
1346  deallocate( fstrsolid%sections )
1347  endif
1348 
1349  if( associated(fstrsolid%GL) ) then
1350  deallocate(fstrsolid%GL ,stat=ierror)
1351  if( ierror /= 0 ) then
1352  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, GL>'
1353  call flush(idbg)
1354  call hecmw_abort( hecmw_comm_get_comm())
1355  end if
1356  endif
1357  if( associated(fstrsolid%EFORCE) ) then
1358  deallocate(fstrsolid%EFORCE ,stat=ierror)
1359  if( ierror /= 0 ) then
1360  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, EFORCE>'
1361  call flush(idbg)
1362  call hecmw_abort( hecmw_comm_get_comm())
1363  end if
1364  endif
1365  if( associated(fstrsolid%unode) ) then
1366  deallocate(fstrsolid%unode ,stat=ierror)
1367  if( ierror /= 0 ) then
1368  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, unode>'
1369  call flush(idbg)
1370  call hecmw_abort( hecmw_comm_get_comm())
1371  end if
1372  endif
1373  if( associated(fstrsolid%unode_bak) ) then
1374  deallocate(fstrsolid%unode_bak ,stat=ierror)
1375  if( ierror /= 0 ) then
1376  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, unode_bak>'
1377  call flush(idbg)
1378  call hecmw_abort( hecmw_comm_get_comm())
1379  end if
1380  endif
1381  if( associated(fstrsolid%dunode) ) then
1382  deallocate(fstrsolid%dunode ,stat=ierror)
1383  if( ierror /= 0 ) then
1384  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, dunode>'
1385  call flush(idbg)
1386  call hecmw_abort( hecmw_comm_get_comm())
1387  end if
1388  endif
1389  if( associated(fstrsolid%ddunode) ) then
1390  deallocate(fstrsolid%ddunode ,stat=ierror)
1391  if( ierror /= 0 ) then
1392  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, ddunode>'
1393  call flush(idbg)
1394  call hecmw_abort( hecmw_comm_get_comm())
1395  end if
1396  endif
1397  if( associated(fstrsolid%QFORCE) ) then
1398  deallocate(fstrsolid%QFORCE ,stat=ierror)
1399  if( ierror /= 0 ) then
1400  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, QFORCE>'
1401  call flush(idbg)
1402  call hecmw_abort( hecmw_comm_get_comm())
1403  end if
1404  endif
1405  if( associated(fstrsolid%temperature) ) then
1406  deallocate(fstrsolid%temperature ,stat=ierror)
1407  if( ierror /= 0 ) then
1408  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, temperature>'
1409  call flush(idbg)
1410  call hecmw_abort( hecmw_comm_get_comm())
1411  end if
1412  endif
1413  if( associated(fstrsolid%last_temp) ) then
1414  deallocate(fstrsolid%last_temp ,stat=ierror)
1415  if( ierror /= 0 ) then
1416  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, reftemp>'
1417  call flush(idbg)
1418  call hecmw_abort( hecmw_comm_get_comm())
1419  end if
1420  endif
1421  if( associated(fstrsolid%temp_bak) ) then
1422  deallocate(fstrsolid%temp_bak ,stat=ierror)
1423  if( ierror /= 0 ) then
1424  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, reftemp>'
1425  call flush(idbg)
1426  call hecmw_abort( hecmw_comm_get_comm())
1427  end if
1428  endif
1429 
1430  ! Allocated in in f str_setup_BOUNDARY */
1431  if( associated(fstrsolid%BOUNDARY_ngrp_GRPID) ) then
1432  deallocate(fstrsolid%BOUNDARY_ngrp_GRPID, stat=ierror)
1433  if( ierror /= 0 ) then
1434  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, BOUNDARY_ngrp_GRPID>'
1435  call flush(idbg)
1436  call hecmw_abort( hecmw_comm_get_comm())
1437  end if
1438  endif
1439  if( associated(fstrsolid%BOUNDARY_ngrp_ID) ) then
1440  deallocate(fstrsolid%BOUNDARY_ngrp_ID, stat=ierror)
1441  if( ierror /= 0 ) then
1442  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, BOUNDARY_ngrp_ID>'
1443  call flush(idbg)
1444  call hecmw_abort( hecmw_comm_get_comm())
1445  end if
1446  endif
1447  if( associated(fstrsolid%BOUNDARY_ngrp_type) ) then
1448  deallocate(fstrsolid%BOUNDARY_ngrp_type, stat=ierror)
1449  if( ierror /= 0 ) then
1450  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, BOUNDARY_ngrp_type>'
1451  call flush(idbg)
1452  call hecmw_abort( hecmw_comm_get_comm())
1453  end if
1454  endif
1455  if( associated(fstrsolid%BOUNDARY_ngrp_val) ) then
1456  deallocate(fstrsolid%BOUNDARY_ngrp_val, stat=ierror)
1457  if( ierror /= 0 ) then
1458  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, BOUNDARY_ngrp_val>'
1459  call flush(idbg)
1460  call hecmw_abort( hecmw_comm_get_comm())
1461  end if
1462  endif
1463  if( associated(fstrsolid%BOUNDARY_ngrp_amp) ) then
1464  deallocate(fstrsolid%BOUNDARY_ngrp_amp, stat=ierror)
1465  if( ierror /= 0 ) then
1466  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, BOUNDARY_ngrp_amp>'
1467  call flush(idbg)
1468  call hecmw_abort( hecmw_comm_get_comm())
1469  end if
1470  endif
1471  if( associated(fstrsolid%BOUNDARY_ngrp_istot) ) then
1472  deallocate(fstrsolid%BOUNDARY_ngrp_istot, stat=ierror)
1473  if( ierror /= 0 ) then
1474  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, BOUNDARY_ngrp_istot>'
1475  call flush(idbg)
1476  call hecmw_abort( hecmw_comm_get_comm())
1477  end if
1478  endif
1479  if( associated(fstrsolid%BOUNDARY_ngrp_rotID) ) then
1480  deallocate(fstrsolid%BOUNDARY_ngrp_rotID, stat=ierror)
1481  if( ierror /= 0 ) then
1482  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, BOUNDARY_ngrp_rotID>'
1483  call flush(idbg)
1484  call hecmw_abort( hecmw_comm_get_comm())
1485  end if
1486  endif
1487  if( associated(fstrsolid%BOUNDARY_ngrp_centerID) ) then
1488  deallocate(fstrsolid%BOUNDARY_ngrp_centerID, stat=ierror)
1489  if( ierror /= 0 ) then
1490  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, BOUNDARY_ngrp_centerID>'
1491  call flush(idbg)
1492  call hecmw_abort( hecmw_comm_get_comm())
1493  end if
1494  endif
1495 
1496  ! Allocated in in fstr_setup_CLOAD
1497  if( associated(fstrsolid%CLOAD_ngrp_GRPID) ) then
1498  deallocate(fstrsolid%CLOAD_ngrp_GRPID, stat=ierror)
1499  if( ierror /= 0 ) then
1500  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, CLOAD_ngrp_GRPID>'
1501  call flush(idbg)
1502  call hecmw_abort( hecmw_comm_get_comm())
1503  end if
1504  endif
1505  if( associated(fstrsolid%CLOAD_ngrp_ID) ) then
1506  deallocate(fstrsolid%CLOAD_ngrp_ID, stat=ierror)
1507  if( ierror /= 0 ) then
1508  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, CLOAD_ngrp_ID>'
1509  call flush(idbg)
1510  call hecmw_abort( hecmw_comm_get_comm())
1511  end if
1512  endif
1513  if( associated(fstrsolid%CLOAD_ngrp_DOF) ) then
1514  deallocate(fstrsolid%CLOAD_ngrp_DOF, stat=ierror)
1515  if( ierror /= 0 ) then
1516  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, CLOAD_ngrp_DOF>'
1517  call flush(idbg)
1518  call hecmw_abort( hecmw_comm_get_comm())
1519  end if
1520  endif
1521  if( associated(fstrsolid%CLOAD_ngrp_val) ) then
1522  deallocate(fstrsolid%CLOAD_ngrp_val, stat=ierror)
1523  if( ierror /= 0 ) then
1524  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, CLOAD_ngrp_val>'
1525  call flush(idbg)
1526  call hecmw_abort( hecmw_comm_get_comm())
1527  end if
1528  endif
1529  if( associated(fstrsolid%CLOAD_ngrp_amp) ) then
1530  deallocate(fstrsolid%CLOAD_ngrp_amp, stat=ierror)
1531  if( ierror /= 0 ) then
1532  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, CLOAD_ngrp_amp>'
1533  call flush(idbg)
1534  call hecmw_abort( hecmw_comm_get_comm())
1535  end if
1536  endif
1537  if( associated(fstrsolid%CLOAD_ngrp_rotID) ) then
1538  deallocate(fstrsolid%CLOAD_ngrp_rotID, stat=ierror)
1539  if( ierror /= 0 ) then
1540  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, CLOAD_ngrp_rotID>'
1541  call flush(idbg)
1542  call hecmw_abort( hecmw_comm_get_comm())
1543  end if
1544  endif
1545  if( associated(fstrsolid%CLOAD_ngrp_centerID) ) then
1546  deallocate(fstrsolid%CLOAD_ngrp_centerID, stat=ierror)
1547  if( ierror /= 0 ) then
1548  write(idbg,*) 'stop due to deallocation error <FSTR_SOLID, CLOAD_ngrp_centerID>'
1549  call flush(idbg)
1550  call hecmw_abort( hecmw_comm_get_comm())
1551  end if
1552  endif
1553 
1554  end subroutine
1555 
1557  subroutine fstr_heat_init( fstrHEAT )
1558  implicit none
1559  type(fstr_heat) :: fstrHEAT
1560 
1561  fstrheat%STEPtot = 0
1562  fstrheat%MATERIALtot = 0
1563  fstrheat%AMPLITUDEtot= 0
1564  fstrheat%T_FIX_tot = 0
1565  fstrheat%Q_NOD_tot = 0
1566  fstrheat%Q_VOL_tot = 0
1567  fstrheat%Q_SUF_tot = 0
1568  fstrheat%R_SUF_tot = 0
1569  fstrheat%H_SUF_tot = 0
1570  fstrheat%WL_tot = 0
1571  fstrheat%beta = -1.0d0
1572  end subroutine fstr_heat_init
1573 
1575  subroutine fstr_eigen_init( fstrEIG )
1576  implicit none
1577  type(fstr_eigen) :: fstrEIG
1578 
1579  fstreig%nget = 5
1580  fstreig%maxiter = 60
1581  fstreig%iter = 0
1582  fstreig%sigma = 0.0d0
1583  fstreig%tolerance = 1.0d-6
1584  fstreig%totalmass = 0.0d0
1585  end subroutine fstr_eigen_init
1586 
1588  subroutine fstr_dynamic_init( fstrDYNAMIC )
1589  use m_fstr
1590  type(fstr_dynamic) :: fstrDYNAMIC
1591  fstrdynamic%idx_eqa = 1
1592  fstrdynamic%idx_resp = 1
1593  fstrdynamic%n_step = 1
1594  fstrdynamic%t_start = 0.0
1595  fstrdynamic%t_curr = 0.0d0
1596  fstrdynamic%t_end = 1.0
1597  fstrdynamic%t_delta = 1.0
1598  fstrdynamic%gamma = 0.5
1599  fstrdynamic%beta = 0.25
1600  fstrdynamic%idx_mas = 1
1601  fstrdynamic%idx_dmp = 1
1602  fstrdynamic%ray_m = 0.0
1603  fstrdynamic%ray_k = 0.0
1604  fstrdynamic%restart_nout = 0
1605  fstrdynamic%nout = 100
1606  fstrdynamic%ngrp_monit = 0
1607  fstrdynamic%nout_monit = 1
1608  fstrdynamic%iout_list(1) = 0
1609  fstrdynamic%iout_list(2) = 0
1610  fstrdynamic%iout_list(3) = 0
1611  fstrdynamic%iout_list(4) = 0
1612  fstrdynamic%iout_list(5) = 0
1613  fstrdynamic%iout_list(6) = 0
1614 
1615  end subroutine fstr_dynamic_init
1616 
1617 
1619  subroutine fstr_dynamic_alloc( hecMESH, fstrDYNAMIC )
1620  use m_fstr
1621  type(hecmwst_local_mesh),target :: hecMESH
1622  type(fstr_dynamic) :: fstrDYNAMIC
1623 
1624  integer :: ierror, ndof,nnod
1625 
1626  ndof=hecmesh%n_dof
1627  nnod=hecmesh%n_node
1628  if(fstrdynamic%idx_eqa == 11) then
1629  allocate( fstrdynamic%DISP(ndof*nnod,3) ,stat=ierror )
1630  if( ierror /= 0 ) then
1631  write(idbg,*) 'stop due to allocation error <fstr_solve_LINEAR_DYNAMIC, DISP>'
1632  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1633  call flush(idbg)
1634  call hecmw_abort( hecmw_comm_get_comm())
1635  end if
1636  allocate( fstrdynamic%VEL (ndof*nnod,1) ,stat=ierror )
1637  if( ierror /= 0 ) then
1638  write(idbg,*) 'stop due to allocation error <fstr_solve_LINEAR_DYNAMIC, VEL>'
1639  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1640  call flush(idbg)
1641  call hecmw_abort( hecmw_comm_get_comm())
1642  end if
1643  allocate( fstrdynamic%ACC (ndof*nnod,1) ,stat=ierror )
1644  if( ierror /= 0 ) then
1645  write(idbg,*) 'stop due to allocation error <fstr_solve_LINEAR_DYNAMIC, ACC>'
1646  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1647  call flush(idbg)
1648  call hecmw_abort( hecmw_comm_get_comm())
1649  end if
1650  else
1651  allocate( fstrdynamic%DISP(ndof*nnod,2) ,stat=ierror )
1652  if( ierror /= 0 ) then
1653  write(idbg,*) 'stop due to allocation error <fstr_solve_LINEAR_DYNAMIC, DISP>'
1654  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1655  call flush(idbg)
1656  call hecmw_abort( hecmw_comm_get_comm())
1657  end if
1658  allocate( fstrdynamic%VEL (ndof*nnod,2) ,stat=ierror )
1659  if( ierror /= 0 ) then
1660  write(idbg,*) 'stop due to allocation error <fstr_solve_LINEAR_DYNAMIC, VEL>'
1661  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1662  call flush(idbg)
1663  call hecmw_abort( hecmw_comm_get_comm())
1664  end if
1665  allocate( fstrdynamic%ACC (ndof*nnod,2) ,stat=ierror )
1666  if( ierror /= 0 ) then
1667  write(idbg,*) 'stop due to allocation error <fstr_solve_LINEAR_DYNAMIC, ACC>'
1668  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1669  call flush(idbg)
1670  call hecmw_abort( hecmw_comm_get_comm())
1671  end if
1672  endif
1673 
1674 
1675  allocate( fstrdynamic%VEC1(ndof*nnod) ,stat=ierror )
1676  if( ierror /= 0 ) then
1677  write(idbg,*) 'stop due to allocation error <fstr_solve_LINEAR_DYNAMIC, VEC1>'
1678  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1679  call flush(idbg)
1680  call hecmw_abort( hecmw_comm_get_comm())
1681  end if
1682  allocate( fstrdynamic%VEC2(ndof*nnod) ,stat=ierror )
1683  if( ierror /= 0 ) then
1684  write(idbg,*) 'stop due to allocation error <fstr_solve_LINEAR_DYNAMIC, VEC2>'
1685  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1686  call flush(idbg)
1687  call hecmw_abort( hecmw_comm_get_comm())
1688  end if
1689  allocate( fstrdynamic%VEC3(ndof*nnod) ,stat=ierror )
1690  if( ierror /= 0 ) then
1691  write(idbg,*) 'stop due to allocation error <fstr_solve_LINEAR_DYNAMIC, VEC3>'
1692  write(idbg,*) ' rank = ', hecmesh%my_rank,' ierror = ',ierror
1693  call flush(idbg)
1694  call hecmw_abort( hecmw_comm_get_comm())
1695  end if
1696 
1697  end subroutine fstr_dynamic_alloc
1698 
1700  subroutine fstr_dynamic_finalize( fstrDYNAMIC )
1701  type(fstr_dynamic) :: fstrDYNAMIC
1702 
1703  integer :: ierror
1704  if( associated(fstrdynamic%DISP) ) &
1705  deallocate( fstrdynamic%DISP ,stat=ierror )
1706  if( ierror /= 0 ) then
1707  write(idbg,*) 'stop due to deallocation error <fstr_solve_LINEAR_DYNAMIC, DISP>'
1708  call flush(idbg)
1709  call hecmw_abort( hecmw_comm_get_comm())
1710  end if
1711  if( associated(fstrdynamic%VEL) ) &
1712  deallocate( fstrdynamic%VEL ,stat=ierror )
1713  if( ierror /= 0 ) then
1714  write(idbg,*) 'stop due to deallocation error <fstr_solve_LINEAR_DYNAMIC, VEL>'
1715  call flush(idbg)
1716  call hecmw_abort( hecmw_comm_get_comm())
1717  end if
1718  if( associated(fstrdynamic%ACC) ) &
1719  deallocate( fstrdynamic%ACC ,stat=ierror )
1720  if( ierror /= 0 ) then
1721  write(idbg,*) 'stop due to deallocation error <fstr_solve_LINEAR_DYNAMIC, ACC>'
1722  call flush(idbg)
1723  call hecmw_abort( hecmw_comm_get_comm())
1724  end if
1725  if( associated(fstrdynamic%VEC1) ) &
1726  deallocate( fstrdynamic%VEC1 ,stat=ierror )
1727  if( ierror /= 0 ) then
1728  write(idbg,*) 'stop due to deallocation error <fstr_solve_LINEAR_DYNAMIC, VEC1>'
1729  call flush(idbg)
1730  call hecmw_abort( hecmw_comm_get_comm())
1731  end if
1732  if( associated(fstrdynamic%VEC2) ) &
1733  deallocate( fstrdynamic%VEC2 ,stat=ierror )
1734  if( ierror /= 0 ) then
1735  write(idbg,*) 'stop due to deallocation error <fstr_solve_LINEAR_DYNAMIC, VEC2>'
1736  call flush(idbg)
1737  call hecmw_abort( hecmw_comm_get_comm())
1738  end if
1739  if( associated(fstrdynamic%VEC3) ) &
1740  deallocate( fstrdynamic%VEC3 ,stat=ierror )
1741  if( ierror /= 0 ) then
1742  write(idbg,*) 'stop due to deallocation error <fstr_solve_LINEAR_DYNAMIC, VEC3>'
1743  call flush(idbg)
1744  call hecmw_abort( hecmw_comm_get_comm())
1745  end if
1746 
1747  end subroutine
1748 
1749 
1750  !-----------------------------------------------------------------------------!
1752 
1753  subroutine fstr_setup_post_phys_alloc(phys, NDOF, n_node, n_elem)
1754  implicit none
1755  type(fstr_solid_physic_val), pointer :: phys
1756  integer(kind=kint) :: NDOF, n_node, n_elem, mdof
1757  mdof = (ndof*ndof+ndof)/2;
1758  allocate ( phys%STRAIN (mdof*n_node))
1759  allocate ( phys%STRESS (mdof*n_node))
1760  allocate ( phys%MISES ( n_node))
1761  allocate ( phys%ESTRAIN (mdof*n_elem))
1762  allocate ( phys%ESTRESS (mdof*n_elem))
1763  allocate ( phys%EMISES ( n_elem))
1764  allocate ( phys%EPLSTRAIN ( n_elem))
1765  allocate ( phys%ENQM (12*n_elem))
1766  end subroutine fstr_setup_post_phys_alloc
1767 
1768  subroutine fstr_setup_post( ctrl, P )
1769  implicit none
1770  integer(kind=kint) :: ctrl, i
1771  type(fstr_param_pack) :: P
1772  type(fstr_solid_physic_val), pointer :: phys => null()
1773 
1774  if( p%PARAM%solution_type == kststatic &
1775  .or. p%PARAM%solution_type == ksteigen &
1776  .or. p%PARAM%solution_type == kstdynamic &
1777  .or. p%PARAM%solution_type == kststaticeigen ) then
1778  ! Memory Allocation for Result Vectors ------------
1779  if( p%MESH%n_dof == 6 .or. p%SOLID%is_33shell == 1 ) then
1780  allocate ( p%SOLID%SHELL )
1781  call fstr_setup_post_phys_alloc(p%SOLID%SHELL,3, p%MESH%n_node,p%MESH%n_elem)
1782  allocate ( p%SOLID%SHELL%LAYER(p%SOLID%max_lyr) )
1783  do i=1,p%SOLID%max_lyr
1784  allocate ( p%SOLID%SHELL%LAYER(i)%PLUS )
1785  allocate ( p%SOLID%SHELL%LAYER(i)%MINUS )
1786  call fstr_setup_post_phys_alloc(p%SOLID%SHELL%LAYER(i)%PLUS , 3, p%MESH%n_node, p%MESH%n_elem)
1787  call fstr_setup_post_phys_alloc(p%SOLID%SHELL%LAYER(i)%MINUS, 3, p%MESH%n_node, p%MESH%n_elem)
1788  enddo
1789  phys => p%SOLID%SHELL
1790  else
1791  allocate ( p%SOLID%SOLID )
1792  phys => p%SOLID%SOLID
1793  call fstr_setup_post_phys_alloc(phys, p%MESH%n_dof, p%MESH%n_node, p%MESH%n_elem)
1794  end if
1795  p%SOLID%STRAIN => phys%STRAIN
1796  p%SOLID%STRESS => phys%STRESS
1797  p%SOLID%MISES => phys%MISES
1798  p%SOLID%ESTRAIN => phys%ESTRAIN
1799  p%SOLID%ESTRESS => phys%ESTRESS
1800  p%SOLID%EMISES => phys%EMISES
1801  p%SOLID%ENQM => phys%ENQM
1802  allocate( p%SOLID%REACTION( p%MESH%n_dof*p%MESH%n_node ) )
1803  end if
1804 
1805  if( p%PARAM%fg_visual == kon )then
1806  call fstr_setup_visualize( ctrl, p%MESH )
1807  end if
1808 
1809  call hecmw_barrier( p%MESH ) ! JP-7
1810 
1811  if( p%HEAT%STEPtot == 0 ) then ! No !HEAT Input
1812  if( p%PARAM%analysis_n == 0 ) then ! No !STATIC Input
1813  call reallocate_real( p%PARAM%dtime, 1)
1814  call reallocate_real( p%PARAM%etime, 1)
1815  call reallocate_real( p%PARAM%dtmin, 1)
1816  call reallocate_real( p%PARAM%delmax,1)
1817  call reallocate_integer( p%PARAM%itmax, 1)
1818  call reallocate_real( p%PARAM%eps, 1)
1819  p%PARAM%analysis_n = 1
1820  p%PARAM%dtime = 0
1821  p%PARAM%etime = 0
1822  p%PARAM%dtmin = 0
1823  p%PARAM%delmax = 0
1824  p%PARAM%itmax = 20
1825  p%PARAM%eps = 1.0e-6
1826  end if
1827  p%HEAT%STEPtot = 1
1828  call reallocate_real( p%HEAT%STEP_DLTIME, 1)
1829  call reallocate_real( p%HEAT%STEP_EETIME, 1)
1830  call reallocate_real( p%HEAT%STEP_DELMIN, 1)
1831  call reallocate_real( p%HEAT%STEP_DELMAX, 1)
1832  p%HEAT%STEP_DLTIME = 0
1833  p%HEAT%STEP_EETIME = 0
1834  p%HEAT%STEP_DELMIN = 0
1835  p%HEAT%STEP_DELMAX = 0
1836  end if
1837  end subroutine fstr_setup_post
1838 
1839  !*****************************************************************************!
1840  !* GENERAL HEADERS ***********************************************************!
1841  !*****************************************************************************!
1842 
1843  !-----------------------------------------------------------------------------!
1845  !-----------------------------------------------------------------------------!
1846 
1847  subroutine fstr_setup_solution( ctrl, counter, P )
1848  implicit none
1849  integer(kind=kint) :: ctrl
1850  integer(kind=kint) :: counter
1851  type(fstr_param_pack) :: P
1852 
1853  integer(kind=kint) :: rcode
1854 
1855  rcode = fstr_ctrl_get_solution( ctrl, p%PARAM%solution_type, p%PARAM%nlgeom )
1856  if( rcode /= 0 ) call fstr_ctrl_err_stop
1857 
1858  end subroutine fstr_setup_solution
1859 
1860  !-----------------------------------------------------------------------------!
1862  !-----------------------------------------------------------------------------!
1863 
1864  subroutine fstr_setup_nonlinear_solver( ctrl, counter, P )
1865  implicit none
1866  integer(kind=kint) :: ctrl
1867  integer(kind=kint) :: counter
1868  type(fstr_param_pack) :: P
1869 
1870  integer(kind=kint) :: rcode
1871 
1872  rcode = fstr_ctrl_get_nonlinear_solver( ctrl, p%PARAM%nlsolver_method )
1873  if( rcode /= 0 ) call fstr_ctrl_err_stop
1874 
1875  end subroutine fstr_setup_nonlinear_solver
1876 
1877  !-----------------------------------------------------------------------------!
1879  !-----------------------------------------------------------------------------!
1880 
1881  subroutine fstr_setup_solver( ctrl, counter, P )
1882  implicit none
1883  integer(kind=kint) :: ctrl
1884  integer(kind=kint) :: counter
1885  type(fstr_param_pack),target :: P
1886 
1887  integer(kind=kint) :: rcode
1888 
1889  if( counter >= 2 ) then
1890  write(ilog,*) '### Error : !SOLVER exists twice in FSTR control file.'
1891  stop
1892  endif
1893 
1894  ! nier => svIarray(1)
1895  ! method => svIarray(2)
1896  ! precond => svIarray(3)
1897  ! nset => svIarray(4)
1898  ! iterpremax => svIarray(5)
1899  ! nrest => svIarray(6)
1900  ! scaling => svIarray(7)
1901  ! iterlog => svIarray(21)
1902  ! timelog => svIarray(22)
1903  ! steplog => svIarray(23)
1904  ! dumptype => svIarray(31)
1905  ! dumpexit => svIarray(32)
1906  ! usejad => svIarray(33)
1907  ! ncolor_in => svIarray(34)
1908  ! mpc_method => svIarray(13)
1909  ! estcond => svIarray(14)
1910  ! contact_elim=> svIarray(15)
1911  ! method2 => svIarray(8)
1912  ! recyclepre => svIarray(35)
1913  ! solver_opt => svIarray(41:50)
1914  ! nBFGS => svIarray(60)
1915 
1916  ! resid => svRarray(1)
1917  ! sigma_diag => svRarray(2)
1918  ! sigma => svRarray(3)
1919  ! thresh => svRarray(4)
1920  ! filter => svRarray(5)
1921 
1922  rcode = fstr_ctrl_get_solver( ctrl, &
1923  sviarray(2), sviarray(3), sviarray(4), sviarray(21), sviarray(22), sviarray(23),&
1924  sviarray(1), sviarray(5), sviarray(6), sviarray(60), sviarray(7), &
1925  sviarray(31), sviarray(32), sviarray(33), sviarray(34), sviarray(13), sviarray(14), sviarray(8),&
1926  sviarray(35), sviarray(41:50), sviarray(15), &
1927  svrarray(1), svrarray(2), svrarray(3), &
1928  svrarray(4), svrarray(5) )
1929  if( rcode /= 0 ) call fstr_ctrl_err_stop
1930 
1931  if( sviarray(2) <= 100 ) then
1932  sviarray(99) = 1 ! indirect method
1933  else
1934  sviarray(99) = sviarray(2)-99 !2 ! direct method
1935  end if
1936 
1937  end subroutine fstr_setup_solver
1938 
1939  !* ----------------------------------------------------------------------------------------------- *!
1941  !* ----------------------------------------------------------------------------------------------- *!
1942 
1943  integer function fstr_setup_orientation( ctrl, hecMESH, cnt, coordsys )
1944  implicit none
1945  integer(kind=kint) :: ctrl
1946  type( hecmwst_local_mesh ) :: hecmesh
1947  integer :: cnt
1948  type( tlocalcoordsys ) :: coordsys
1949 
1950  integer :: j, is, ie, grp_id(1)
1951  character(len=HECMW_NAME_LEN) :: grp_id_name(1)
1952 
1953  integer :: nid, dtype
1954  character(len=HECMW_NAME_LEN) :: data_fmt
1955  real(kind=kreal) :: fdum, xyza(3), xyzb(3), xyzc(3), ff1(3), ff2(3), ff3(3)
1956 
1958 
1959  nid = 1
1960  coordsys%sys_type = 10
1961 
1962  nid = 1
1963  data_fmt = 'COORDINATES,NODES '
1964  if( fstr_ctrl_get_param_ex( ctrl, 'DEFINITION ', data_fmt, 0, 'P', nid )/=0 ) return
1965  dtype = nid-1
1966  coordsys%sys_type = coordsys%sys_type + dtype
1967 
1968  if( fstr_ctrl_get_param_ex( ctrl, 'NAME ', '# ', 1, 'S', grp_id_name(1) )/= 0) return
1969  coordsys%sys_name = grp_id_name(1)
1970  call fstr_strupr( coordsys%sys_name )
1971 
1972  if( dtype==0 ) then
1973  data_fmt = "RRRRRRrrr "
1974  xyzc(:) = 0.d0
1975  if( fstr_ctrl_get_data_ex( ctrl, 1, data_fmt, xyza(1), xyza(2), &
1976  xyza(3), xyzb(1), xyzb(2), xyzb(3), xyzc(1), xyzc(2), xyzc(3) )/=0 ) return
1977  if( coordsys%sys_type==10 ) then
1978  ff1 = xyza-xyzc
1979  fdum = dsqrt( dot_product(ff1, ff1) )
1980  if( fdum==0.d0 ) return
1981  ff1 = ff1/fdum
1982  ff2 = xyzb-xyzc
1983  call cross_product(ff1,ff2,ff3)
1984  coordsys%CoordSys(1,:) = ff1
1985 
1986  fdum = dsqrt( dot_product(ff3, ff3) )
1987  if( fdum==0.d0 ) return
1988  coordsys%CoordSys(3,:) = ff3/fdum
1989 
1990  call cross_product(coordsys%CoordSys(3,:), coordsys%CoordSys(1,:), coordsys%CoordSys(2,:) )
1991  else
1992  coordsys%CoordSys(1,:) = xyza
1993  coordsys%CoordSys(2,:) = xyzb
1994  endif
1995 
1996  else
1997  coordsys%node_ID(3) = 0 ! global origin
1998  data_fmt = "IIi "
1999  if( fstr_ctrl_get_data_ex( ctrl, 1, data_fmt, coordsys%node_ID(1), &
2000  coordsys%node_ID(2), coordsys%node_ID(3) )/=0 ) return
2001  if( coordsys%node_ID(3) == 0 ) then
2002  nid = node_global_to_local( hecmesh, coordsys%node_ID(1:2), 2 )
2003  if( nid/=0 .and. nid/=2 ) then
2004  write(*,*) "We cannot define coordinate system using nodes in other CPU!"
2005  write(idbg,*) "We cannot define coordinate system using nodes in other CPU!"
2006  return
2007  endif
2008  else
2009  nid = node_global_to_local( hecmesh, coordsys%node_ID, 3 )
2010  if( nid/=0 .and. nid/=3 ) then
2011  write(*,*) "We cannot define coordinate system using nodes in other CPU!"
2012  write(idbg,*) "We cannot define coordinate system using nodes in other CPU!"
2013  return
2014  endif
2015  endif
2016  endif
2017 
2019  end function fstr_setup_orientation
2020 
2021 
2022  !-----------------------------------------------------------------------------!
2024  !-----------------------------------------------------------------------------!
2025 
2026  subroutine fstr_setup_step( ctrl, counter, P )
2027  implicit none
2028  integer(kind=kint) :: ctrl
2029  integer(kind=kint) :: counter
2030  type(fstr_param_pack) :: P
2031  character(HECMW_NAME_LEN) :: amp
2032  integer(kind=kint) :: amp_id
2033 
2034  integer(kind=kint) :: rcode, iproc
2035 
2036  amp = ' '
2037  rcode = fstr_ctrl_get_step( ctrl, amp, iproc )
2038  if( rcode /= 0 ) call fstr_ctrl_err_stop
2039  call amp_name_to_id( p%MESH, '!STEP', amp, amp_id )
2040  ! P%SOLID%NLSTATIC_ngrp_amp = amp_id;
2041 
2042  end subroutine fstr_setup_step
2043 
2044  integer(kind=kint) function fstr_setup_initial( ctrl, cond, hecMESH )
2045  implicit none
2046  integer(kind=kint) :: ctrl
2047  type( tinitialcondition ) :: cond
2048  type(hecmwst_local_mesh) :: hecmesh
2049  integer, pointer :: grp_id(:), dof(:)
2050  real(kind=kreal), pointer :: temp(:)
2051  character(len=HECMW_NAME_LEN), pointer :: grp_id_name(:)
2052  character(len=HECMW_NAME_LEN) :: data_fmt, ss
2053  integer :: i,j,n, is, ie, gid, nid, rcode
2054 
2055  fstr_setup_initial = -1
2056 
2057  ss = 'TEMPERATURE,VELOCITY,ACCELERATION '
2058  rcode = fstr_ctrl_get_param_ex( ctrl, 'TYPE ', ss, 1, 'P', nid )
2059  if( nid==1 ) then
2060  cond%cond_name = "temperature"
2061  allocate( cond%intval(hecmesh%n_node) )
2062  allocate( cond%realval(hecmesh%n_node) )
2063  elseif( nid==2 ) then
2064  cond%cond_name = "velocity"
2065  allocate( cond%intval(hecmesh%n_node) )
2066  allocate( cond%realval(hecmesh%n_node) )
2067  elseif( nid==3 ) then
2068  cond%cond_name = "acceleration"
2069  allocate( cond%intval(hecmesh%n_node) )
2070  allocate( cond%realval(hecmesh%n_node) )
2071  else
2072  return
2073  endif
2074 
2075  cond%intval = -1
2076  cond%realval = 0.d0
2077 
2078  n = fstr_ctrl_get_data_line_n( ctrl )
2079  if( n<=0 ) return
2080  allocate( temp(n), grp_id_name(n), grp_id(n), dof(n) )
2081  dof = 0
2082  write(ss,*) hecmw_name_len
2083  if( nid==1 ) then
2084  write(data_fmt,'(a,a,a)') 'S',trim(adjustl(ss)),'R '
2085  fstr_setup_initial = &
2086  fstr_ctrl_get_data_array_ex( ctrl, data_fmt, grp_id_name, temp )
2087  else
2088  write(data_fmt,'(a,a,a)') 'S',trim(adjustl(ss)),'IR '
2089  fstr_setup_initial = &
2090  fstr_ctrl_get_data_array_ex( ctrl, data_fmt, grp_id_name, dof, temp )
2091  endif
2092 
2093  if( fstr_setup_initial /= 0 ) then
2094  if( associated(grp_id) ) deallocate( grp_id )
2095  if( associated(temp) ) deallocate( temp )
2096  if( associated(dof) ) deallocate( dof )
2097  if( associated(grp_id_name) ) deallocate( grp_id_name )
2098  return
2099  end if
2100 
2101  call node_grp_name_to_id_ex( hecmesh, '!INITIAL CONDITION', n, grp_id_name, grp_id )
2102  do i=1,n
2103  gid = grp_id(i)
2104  is = hecmesh%node_group%grp_index(gid-1) + 1
2105  ie = hecmesh%node_group%grp_index(gid )
2106  do j=is, ie
2107  nid = hecmesh%node_group%grp_item(j)
2108  cond%realval(nid) = temp(i)
2109  cond%intval(nid) = dof(i)
2110  enddo
2111  enddo
2112 
2113  if( associated(grp_id) ) deallocate( grp_id )
2114  if( associated(temp) ) deallocate( temp )
2115  if( associated(dof) ) deallocate( dof )
2116  if( associated(grp_id_name) ) deallocate( grp_id_name )
2117 end function fstr_setup_initial
2118 
2119  !-----------------------------------------------------------------------------!
2121  !-----------------------------------------------------------------------------!
2122 
2123  subroutine fstr_setup_write( ctrl, counter, P )
2124  implicit none
2125  integer(kind=kint) :: ctrl
2126  integer(kind=kint) :: counter
2127  type(fstr_param_pack) :: P
2128  integer(kind=kint) :: res, visual, neutral
2129 
2130  integer(kind=kint) :: rcode
2131 
2132  rcode = fstr_ctrl_get_write( ctrl, res, visual, neutral )
2133  if( rcode /= 0 ) call fstr_ctrl_err_stop
2134  if( res == 1 ) p%PARAM%fg_result = 1
2135  if( visual == 1 ) p%PARAM%fg_visual = 1
2136  if( neutral == 1 ) p%PARAM%fg_neutral = 1
2137 
2138  end subroutine fstr_setup_write
2139 
2140 
2141  !-----------------------------------------------------------------------------!
2143  !-----------------------------------------------------------------------------!
2144  subroutine fstr_setup_echo( ctrl, counter, P )
2145  implicit none
2146  integer(kind=kint) :: ctrl
2147  integer(kind=kint) :: counter
2148  type(fstr_param_pack) :: P
2149 
2150  integer(kind=kint) :: rcode
2151 
2152  rcode = fstr_ctrl_get_echo( ctrl, &
2153  p%PARAM%fg_echo )
2154  if( rcode /= 0 ) call fstr_ctrl_err_stop
2155 
2156  end subroutine fstr_setup_echo
2157 
2158 
2159  !-----------------------------------------------------------------------------!
2161  !-----------------------------------------------------------------------------!
2162  subroutine fstr_setup_restart( ctrl, nout, version )
2163  implicit none
2164  integer(kind=kint) :: ctrl
2165  integer(kind=kint) :: nout
2166  integer(kind=kint) :: version
2167 
2168  integer(kind=kint) :: rcode
2169  nout = 0
2170  rcode = fstr_ctrl_get_param_ex( ctrl, 'FREQUENCY ', '# ', 0, 'I', nout )
2171  if( rcode /= 0 ) call fstr_ctrl_err_stop
2172  rcode = fstr_ctrl_get_param_ex( ctrl, 'VERSION ', '# ', 0, 'I', version )
2173  if( rcode /= 0 ) call fstr_ctrl_err_stop
2174 
2175  end subroutine fstr_setup_restart
2176 
2177 
2178  !-----------------------------------------------------------------------------!
2180  !-----------------------------------------------------------------------------!
2181 
2182  subroutine fstr_setup_couple( ctrl, counter, P )
2183  implicit none
2184  integer(kind=kint) :: ctrl
2185  integer(kind=kint) :: counter
2186  type(fstr_param_pack) :: P
2187  integer(kind=kint) :: rcode
2188  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
2189  integer(kind=kint) :: i, n, old_size, new_size
2190 
2191  if( p%SOLID%file_type /= kbcffstr ) return
2192 
2193  n = fstr_ctrl_get_data_line_n( ctrl )
2194  if( n == 0 ) return
2195  old_size = p%SOLID%COUPLE_ngrp_tot
2196  new_size = old_size + n
2197  p%SOLID%COUPLE_ngrp_tot = new_size
2198 
2199  call fstr_expand_integer_array ( p%SOLID%COUPLE_ngrp_ID, old_size, new_size )
2200 
2201  allocate( grp_id_name(n))
2202  rcode = fstr_ctrl_get_couple( ctrl, &
2203  p%PARAM%fg_couple_type, &
2204  p%PARAM%fg_couple_first, &
2205  p%PARAM%fg_couple_window, &
2206  grp_id_name, hecmw_name_len )
2207  if( rcode /= 0 ) call fstr_ctrl_err_stop
2208 
2209  call surf_grp_name_to_id_ex( p%MESH, '!COUPLE', &
2210  n, grp_id_name, p%SOLID%COUPLE_ngrp_ID(old_size+1:))
2211 
2212  deallocate( grp_id_name )
2213  p%PARAM%fg_couple = 1
2214 
2215  end subroutine fstr_setup_couple
2216 
2217  !-----------------------------------------------------------------------------!
2219  !-----------------------------------------------------------------------------!
2220 
2221  subroutine fstr_setup_amplitude( ctrl, P )
2222  implicit none
2223  integer(kind=kint) :: ctrl
2224  type(fstr_param_pack) :: P
2225  real(kind=kreal), pointer :: val(:), table(:)
2226  character(len=HECMW_NAME_LEN) :: name
2227  integer :: nline, n, type_def, type_time, type_val, rcode
2228 
2229  nline = fstr_ctrl_get_data_line_n( ctrl )
2230  if( nline<=0 ) return
2231  allocate( val(nline*4) )
2232  allocate( table(nline*4) )
2233  rcode = fstr_ctrl_get_amplitude( ctrl, nline, name, type_def, type_time, type_val, &
2234  n, val, table )
2235  if( rcode /= 0 ) call fstr_ctrl_err_stop
2236 
2237  call append_new_amplitude( p%MESH%amp, name, type_def, type_time, type_val, n, val, table )
2238 
2239  if( associated(val) ) deallocate( val )
2240  if( associated(table) ) deallocate( table )
2241  end subroutine fstr_setup_amplitude
2242 
2243 
2245  subroutine fstr_setup_element_activation( ctrl, counter, P )
2246  implicit none
2247  integer(kind=kint) :: ctrl
2248  integer(kind=kint) :: counter
2249  type(fstr_param_pack) :: P
2250 
2251  integer(kind=kint) :: rcode
2252  character(HECMW_NAME_LEN) :: amp
2253  integer(kind=kint) :: amp_id
2254  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
2255  integer(kind=kint) :: i, n, old_size, new_size
2256  integer(kind=kint) :: gid, dtype, state
2257  real(kind=kreal) :: eps
2258  real(kind=kreal), pointer :: thlow(:), thup(:)
2259 
2260  gid = 1
2261  rcode = fstr_ctrl_get_param_ex( ctrl, 'GRPID ', '# ', 0, 'I', gid )
2262 
2263  n = fstr_ctrl_get_data_line_n( ctrl )
2264  if( n == 0 ) return
2265  old_size = p%SOLID%elemact%ELEMACT_egrp_tot
2266  new_size = old_size + n
2267  p%SOLID%elemact%ELEMACT_egrp_tot = new_size
2268 
2269  call fstr_expand_integer_array ( p%SOLID%elemact%ELEMACT_egrp_GRPID, old_size, new_size )
2270  call fstr_expand_integer_array ( p%SOLID%elemact%ELEMACT_egrp_ID, old_size, new_size )
2271  call fstr_expand_integer_array ( p%SOLID%elemact%ELEMACT_egrp_amp, old_size, new_size )
2272  call fstr_expand_real_array ( p%SOLID%elemact%ELEMACT_egrp_eps, old_size, new_size )
2273  call fstr_expand_integer_array ( p%SOLID%elemact%ELEMACT_egrp_depends, old_size, new_size )
2274  call fstr_expand_real_array ( p%SOLID%elemact%ELEMACT_egrp_ts_lower, old_size, new_size )
2275  call fstr_expand_real_array ( p%SOLID%elemact%ELEMACT_egrp_ts_upper, old_size, new_size )
2276  call fstr_expand_integer_array ( p%SOLID%elemact%ELEMACT_egrp_state, old_size, new_size )
2277 
2278  allocate( grp_id_name(n), thlow(n), thup(n) )
2279  amp = ' '
2280  eps = 1.d-3
2281  rcode = fstr_ctrl_get_element_activation( ctrl, amp, eps, grp_id_name, dtype, state, thlow, thup )
2282  if( rcode /= 0 ) call fstr_ctrl_err_stop
2283 
2284  call amp_name_to_id( p%MESH, '!ELEMENT_ACTIVATION', amp, amp_id )
2285  do i=1,n
2286  p%SOLID%elemact%ELEMACT_egrp_amp(old_size+i) = amp_id
2287  p%SOLID%elemact%ELEMACT_egrp_eps(old_size+i) = eps
2288  end do
2289  p%SOLID%elemact%ELEMACT_egrp_GRPID(old_size+1:new_size) = gid
2290  p%SOLID%elemact%ELEMACT_egrp_depends(old_size+1:new_size) = dtype
2291  p%SOLID%elemact%ELEMACT_egrp_ts_lower(old_size+1:new_size) = thlow(1:n)
2292  p%SOLID%elemact%ELEMACT_egrp_ts_upper(old_size+1:new_size) = thup(1:n)
2293  p%SOLID%elemact%ELEMACT_egrp_state(old_size+1:new_size) = state
2294 
2295  call elem_grp_name_to_id_ex( p%MESH, '!ELEMENT_ACTIVATION', n, grp_id_name, p%SOLID%elemact%ELEMACT_egrp_ID(old_size+1:))
2296 
2297  deallocate( grp_id_name )
2298  end subroutine fstr_setup_element_activation
2299 
2300 
2301  !*****************************************************************************!
2302  !* HEADERS FOR STATIC ANALYSIS ***********************************************!
2303  !*****************************************************************************!
2304 
2305  !-----------------------------------------------------------------------------!
2307  !-----------------------------------------------------------------------------!
2308 
2309  subroutine fstr_setup_static( ctrl, counter, P )
2310  implicit none
2311  integer(kind=kint) :: ctrl
2312  integer(kind=kint) :: counter
2313  type(fstr_param_pack) :: P
2314  integer(kind=kint) :: rcode
2315 
2316  integer :: nout, nout_monit,node_monit_1 ,elem_monit_1 ,intg_monit_1
2317  integer :: ipt, idx_elpl, iout_list(6)
2318  real(kind=kreal) :: sig_y0, h_dash
2319 
2320  if( counter > 1 ) then
2321  write(*,*)
2322  endif
2323 
2324  ipt = 0
2325  if( fstr_ctrl_get_param_ex( ctrl, 'TYPE ', 'INFINITESIMAL,NLGEOM,INFINITE ', 0, 'P', ipt )/=0 ) &
2326  return
2327  if( ipt == 2 ) p%PARAM%nlgeom = .true.
2328 
2329  ! for backward compatibility
2330  if( ipt == 3 ) then
2331  write(*,*) "Warning : !STATIC : parameter 'TYPE=INFINITE' is deprecated." &
2332  & // " Please use the replacement parameter 'TYPE=INFINITESIMAL'"
2333  endif
2334 
2335  rcode = fstr_ctrl_get_static( ctrl, &
2336  dt, etime, itmax, eps, p%SOLID%restart_nout, &
2337  idx_elpl, &
2338  iout_list, &
2339  sig_y0, h_dash, &
2340  nout, nout_monit, node_monit_1, &
2341  elem_monit_1, intg_monit_1 )
2342 
2343  if( rcode /= 0 ) call fstr_ctrl_err_stop
2344 
2345  end subroutine fstr_setup_static
2346 
2347 
2348  !-----------------------------------------------------------------------------!
2350  !-----------------------------------------------------------------------------!
2351 
2352  subroutine fstr_setup_boundary( ctrl, counter, P )
2353  implicit none
2354  integer(kind=kint) :: ctrl
2355  integer(kind=kint) :: counter
2356  type(fstr_param_pack) :: P
2357 
2358  integer(kind=kint) :: rcode
2359  integer(kind=kint) :: type = 0
2360  character(HECMW_NAME_LEN) :: amp, rotc_name(1)
2361  integer(kind=kint) :: amp_id, rotc_id(1), n_rotc
2362  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
2363  integer(kind=kint),pointer :: dof_ids (:)
2364  integer(kind=kint),pointer :: dof_ide (:)
2365  real(kind=kreal),pointer :: val_ptr(:)
2366  integer(kind=kint) :: i, n, old_size, new_size
2367 
2368  integer(kind=kint) :: gid, istot
2369 
2370  gid = 1
2371  rcode = fstr_ctrl_get_param_ex( ctrl, 'GRPID ', '# ', 0, 'I', gid )
2372  ! rcode = fstr_ctrl_get_param_ex( ctrl, 'TYPE ', 'FSTR,NASTRAN ', 0, 'P', type )
2373  ! if( rcode < 0 ) call fstr_ctrl_err_stop
2374  ! if( rcode == 1 ) type = 0 ! PARAM_NOTHING
2375 
2376  ! if( type == 0 ) then
2377 
2378  istot = 0
2379  rcode = fstr_ctrl_get_param_ex( ctrl, 'TOTAL ', '# ', 0, 'E', istot )
2380  if( rcode /= 0 ) call fstr_ctrl_err_stop
2381 
2382  ! get center of torque load
2383  rotc_name = ' '
2384  rotc_id = -1
2385  n_rotc = -1
2386  rcode = fstr_ctrl_get_param_ex( ctrl, 'ROT_CENTER ', '# ', 0, 'S', rotc_name )
2387  if( rcode /= 0 ) call fstr_ctrl_err_stop
2388  if( rotc_name(1) /= ' ' ) then
2389  if( istot /= 0 ) then
2390  write(*,*) 'fstr control file error : !BOUNDARY : rotational boundary cannot be specified with total value'
2391  write(ilog,*) 'fstr control file error : !BOUNDARY : rotational boundary cannot be specified with total value'
2392  call fstr_ctrl_err_stop
2393  endif
2394  p%SOLID%BOUNDARY_ngrp_rot = p%SOLID%BOUNDARY_ngrp_rot + 1
2395  n_rotc = p%SOLID%BOUNDARY_ngrp_rot
2396  call node_grp_name_to_id_ex( p%MESH, '!BOUNDARY,ROT_CENTER=', 1, rotc_name, rotc_id)
2397  endif
2398 
2399 
2400  ! ENTIRE -----------------------------------------------
2401  p%SOLID%file_type = kbcffstr
2402 
2403  n = fstr_ctrl_get_data_line_n( ctrl )
2404  if( n == 0 ) return
2405  old_size = p%SOLID%BOUNDARY_ngrp_tot
2406  new_size = old_size + n
2407  p%SOLID%BOUNDARY_ngrp_tot = new_size
2408  call fstr_expand_integer_array (p%SOLID%BOUNDARY_ngrp_GRPID, old_size, new_size )
2409  call fstr_expand_integer_array (p%SOLID%BOUNDARY_ngrp_ID, old_size, new_size )
2410  call fstr_expand_integer_array (p%SOLID%BOUNDARY_ngrp_type, old_size, new_size )
2411  call fstr_expand_real_array (p%SOLID%BOUNDARY_ngrp_val, old_size, new_size )
2412  call fstr_expand_integer_array (p%SOLID%BOUNDARY_ngrp_amp, old_size, new_size )
2413  call fstr_expand_integer_array (p%SOLID%BOUNDARY_ngrp_istot, old_size, new_size )
2414  call fstr_expand_integer_array (p%SOLID%BOUNDARY_ngrp_rotID, old_size, new_size )
2415  call fstr_expand_integer_array (p%SOLID%BOUNDARY_ngrp_centerID, old_size, new_size )
2416 
2417  allocate( grp_id_name(n) )
2418  allocate( dof_ids(n) )
2419  allocate( dof_ide(n) )
2420 
2421  amp = ' '
2422  val_ptr => p%SOLID%BOUNDARY_ngrp_val(old_size+1:)
2423  val_ptr = 0
2424  rcode = fstr_ctrl_get_boundary( ctrl, amp, grp_id_name, hecmw_name_len, dof_ids, dof_ide, val_ptr)
2425  if( rcode /= 0 ) call fstr_ctrl_err_stop
2426  call amp_name_to_id( p%MESH, '!BOUNDARY', amp, amp_id )
2427  p%SOLID%BOUNDARY_ngrp_GRPID(old_size+1:new_size) = gid
2428  call node_grp_name_to_id_ex( p%MESH, '!BOUNDARY', n, grp_id_name, p%SOLID%BOUNDARY_ngrp_ID(old_size+1:))
2429  p%SOLID%BOUNDARY_ngrp_istot(old_size+1:new_size) = istot
2430 
2431  ! set up information about rotation ( default value is set if ROT_CENTER is not given.)
2432  p%SOLID%BOUNDARY_ngrp_rotID(old_size+1:) = n_rotc
2433  p%SOLID%BOUNDARY_ngrp_centerID(old_size+1:) = rotc_id(1)
2434 
2435  do i = 1, n
2436  if( (dof_ids(i) < 1).or.(6 < dof_ids(i)).or.(dof_ide(i) < 1).or.(6 < dof_ide(i)) ) then
2437  write(*,*) 'fstr control file error : !BOUNDARY : range of dof_ids and dof_ide is from 1 to 6'
2438  write(ilog,*) 'fstr control file error : !BOUNDARY : range of dof_ids and dof_ide is from 1 to 6'
2439  call fstr_ctrl_err_stop
2440  end if
2441  p%SOLID%BOUNDARY_ngrp_type(old_size+i) = 10 * dof_ids(i) + dof_ide(i)
2442  p%SOLID%BOUNDARY_ngrp_amp(old_size+i) = amp_id
2443  end do
2444 
2445  deallocate( grp_id_name )
2446  deallocate( dof_ids )
2447  deallocate( dof_ide )
2448  ! else
2449  ! ! NASTRAN ---------------------------------------------
2450  !
2451  ! P%SOLID%file_type = kbcfNASTRAN
2452  ! call fstr_setup_solid_nastran( ctrl, P%MESH, P%SOLID )
2453  ! end if
2454 
2455  end subroutine fstr_setup_boundary
2456 
2457 
2458  !-----------------------------------------------------------------------------!
2460  !-----------------------------------------------------------------------------!
2461 
2462  subroutine fstr_setup_cload( ctrl, counter, P )
2463  implicit none
2464  integer(kind=kint) :: ctrl
2465  integer(kind=kint) :: counter
2466  type(fstr_param_pack) :: P
2467 
2468  integer(kind=kint) :: rcode
2469  character(HECMW_NAME_LEN) :: amp, rotc_name(1)
2470  integer(kind=kint) :: amp_id, rotc_id(1), n_rotc
2471  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
2472  real(kind=kreal),pointer :: val_ptr(:)
2473  integer(kind=kint),pointer :: id_ptr(:)
2474  integer(kind=kint) :: i, n, old_size, new_size
2475  integer(kind=kint) :: gid
2476 
2477  if( p%SOLID%file_type /= kbcffstr ) return
2478  gid = 1
2479  rcode = fstr_ctrl_get_param_ex( ctrl, 'GRPID ', '# ', 0, 'I', gid )
2480  if( rcode /= 0 ) call fstr_ctrl_err_stop
2481 
2482  ! get center of torque load
2483  rotc_name = ' '
2484  rotc_id = -1
2485  n_rotc = -1
2486  rcode = fstr_ctrl_get_param_ex( ctrl, 'ROT_CENTER ', '# ', 0, 'S', rotc_name )
2487  if( rcode /= 0 ) call fstr_ctrl_err_stop
2488  if( rotc_name(1) /= ' ' ) then
2489  p%SOLID%CLOAD_ngrp_rot = p%SOLID%CLOAD_ngrp_rot + 1
2490  n_rotc = p%SOLID%CLOAD_ngrp_rot
2491  call node_grp_name_to_id_ex( p%MESH, '!CLOAD,ROT_CENTER=', 1, rotc_name, rotc_id)
2492  endif
2493 
2494  n = fstr_ctrl_get_data_line_n( ctrl )
2495  if( n == 0 ) return
2496  old_size = p%SOLID%CLOAD_ngrp_tot
2497  new_size = old_size + n
2498  p%SOLID%CLOAD_ngrp_tot = new_size
2499  ! Keiji Suemitsu (20140624) <
2500  call fstr_expand_integer_array ( p%SOLID%CLOAD_ngrp_GRPID, old_size, new_size )
2501  call fstr_expand_integer_array ( p%SOLID%CLOAD_ngrp_ID, old_size, new_size )
2502  call fstr_expand_integer_array ( p%SOLID%CLOAD_ngrp_DOF, old_size, new_size )
2503  call fstr_expand_real_array ( p%SOLID%CLOAD_ngrp_val, old_size, new_size )
2504  call fstr_expand_integer_array ( p%SOLID%CLOAD_ngrp_amp, old_size, new_size )
2505  call fstr_expand_integer_array ( p%SOLID%CLOAD_ngrp_rotID, old_size, new_size )
2506  call fstr_expand_integer_array ( p%SOLID%CLOAD_ngrp_centerID, old_size, new_size )
2507  ! > Keiji Suemitsu (20140624)
2508 
2509  allocate( grp_id_name(n))
2510  amp = ' '
2511  val_ptr => p%SOLID%CLOAD_ngrp_val(old_size+1:)
2512  id_ptr =>p%SOLID%CLOAD_ngrp_DOF(old_size+1:)
2513  val_ptr = 0
2514  rcode = fstr_ctrl_get_cload( ctrl, amp, grp_id_name, hecmw_name_len, id_ptr, val_ptr )
2515  if( rcode /= 0 ) call fstr_ctrl_err_stop
2516 
2517  ! set up information about torque load ( default value is set if ROT_CENTER is not given.)
2518  p%SOLID%CLOAD_ngrp_rotID(old_size+1:) = n_rotc
2519  p%SOLID%CLOAD_ngrp_centerID(old_size+1:) = rotc_id(1)
2520 
2521  call amp_name_to_id( p%MESH, '!CLOAD', amp, amp_id )
2522  do i=1,n
2523  p%SOLID%CLOAD_ngrp_amp(old_size+i) = amp_id
2524  end do
2525  p%SOLID%CLOAD_ngrp_GRPID(old_size+1:new_size) = gid
2526  call node_grp_name_to_id_ex( p%MESH, '!CLOAD', n, grp_id_name, p%SOLID%CLOAD_ngrp_ID(old_size+1:))
2527 
2528  deallocate( grp_id_name )
2529 
2530  if( p%MESH%n_refine > 0 ) then
2531  do i=1,n
2532  if( hecmw_ngrp_get_number(p%MESH, p%SOLID%CLOAD_NGRP_ID(old_size+i)) > 1 ) then
2533  write(*,*) 'fstr control file error : !CLOAD : cannot be used with NGRP when mesh is refined'
2534  write(ilog,*) 'fstr control file error : !CLOAD : cannot be used with NGRP when mesh is refined'
2535  call fstr_ctrl_err_stop
2536  endif
2537  enddo
2538  endif
2539 
2540  end subroutine fstr_setup_cload
2541 
2542  !-----------------------------------------------------------------------------!
2544  !-----------------------------------------------------------------------------!
2545  subroutine fstr_setup_fload( ctrl, counter, P )
2546  !---- args
2547  integer(kind=kint) :: ctrl
2548  integer(kind=kint) :: counter
2549  type(fstr_param_pack) :: P
2550  !---- vals
2551  integer(kind=kint) :: rcode
2552  character(HECMW_NAME_LEN) :: amp
2553  integer(kind=kint) :: amp_id
2554  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
2555  real(kind=kreal), pointer :: val_ptr(:)
2556  integer(kind=kint), pointer :: id_ptr(:), type_ptr(:)
2557  integer(kind=kint) :: i, n, old_size, new_size
2558  integer(kind=kint) :: gid, loadcase
2559  !---- body
2560 
2561  if( p%SOLID%file_type /= kbcffstr) return
2562 
2563  !read grpid
2564  gid = 1
2565  rcode = fstr_ctrl_get_param_ex( ctrl, 'GRPID ', '# ', 0, 'I', gid )
2566  !read loadcase (real=1:default, img=2)
2567  loadcase = kfloadcase_re
2568  rcode = fstr_ctrl_get_param_ex( ctrl, 'LOAD CASE ', '# ', 0, 'I', loadcase)
2569  !write(*,*) "loadcase=", loadcase
2570  !pause
2571 
2572  !read the num of dataline
2573  n = fstr_ctrl_get_data_line_n( ctrl )
2574  if( n == 0 ) return
2575  old_size = p%FREQ%FLOAD_ngrp_tot
2576  new_size = old_size + n
2577 
2578  !expand data array
2579  p%FREQ%FLOAD_ngrp_tot = new_size
2580  call fstr_expand_integer_array( p%FREQ%FLOAD_ngrp_GRPID, old_size, new_size )
2581  call fstr_expand_integer_array( p%FREQ%FLOAD_ngrp_ID, old_size, new_size )
2582  call fstr_expand_integer_array( p%FREQ%FLOAD_ngrp_TYPE, old_size, new_size )
2583  call fstr_expand_integer_array( p%FREQ%FLOAD_ngrp_DOF, old_size, new_size )
2584  call fstr_expand_real_array ( p%FREQ%FLOAD_ngrp_valre, old_size, new_size )
2585  call fstr_expand_real_array ( p%FREQ%FLOAD_ngrp_valim, old_size, new_size )
2586 
2587  !fill bc data
2588  allocate( grp_id_name(n) )
2589  if(loadcase == kfloadcase_re) then
2590  val_ptr => p%FREQ%FLOAD_ngrp_valre(old_size+1:)
2591  else if(loadcase == kfloadcase_im) then
2592  val_ptr => p%FREQ%FLOAD_ngrp_valim(old_size+1:)
2593  else
2594  !error
2595  write(*,*) "Error this load set is not defined!"
2596  write(ilog,*) "Error this load set is not defined!"
2597  stop
2598  end if
2599  id_ptr => p%FREQ%FLOAD_ngrp_DOF(old_size+1:)
2600  type_ptr => p%FREQ%FLOAD_ngrp_TYPE(old_size+1:)
2601  val_ptr = 0.0d0
2602  rcode = fstr_ctrl_get_fload( ctrl, grp_id_name, hecmw_name_len, id_ptr, val_ptr)
2603  if( rcode /= 0 ) call fstr_ctrl_err_stop
2604  p%FREQ%FLOAD_ngrp_GRPID(old_size+1:new_size) = gid
2605  call nodesurf_grp_name_to_id_ex( p%MESH, '!FLOAD', n, grp_id_name, &
2606  p%FREQ%FLOAD_ngrp_ID(old_size+1:), p%FREQ%FLOAD_ngrp_TYPE(old_size+1:))
2607 
2608  deallocate( grp_id_name )
2609  return
2610 
2611  contains
2612 
2613  function fstr_ctrl_get_fload(ctrl, node_id, node_id_len, dof_id, value)
2614  integer(kind=kint) :: ctrl
2615  character(len=HECMW_NAME_LEN) :: node_id(:) !Node group name
2616  integer(kind=kint), pointer :: dof_id(:)
2617  integer(kind=kint) :: node_id_len
2618  real(kind=kreal), pointer :: value(:)
2619  integer(kind=kint) :: fstr_ctrl_get_fload !return value
2620  character(len=HECMW_NAME_LEN) :: data_fmt, ss
2621 
2622  write(ss,*) node_id_len
2623  write(data_fmt, '(a,a,a)') 'S', trim(adjustl(ss)), 'IR '
2624 
2625  fstr_ctrl_get_fload = fstr_ctrl_get_data_array_ex(ctrl, data_fmt, node_id, dof_id, value)
2626  end function
2627 
2628  end subroutine
2629 
2630  !-----------------------------------------------------------------------------!
2632  !-----------------------------------------------------------------------------!
2633  subroutine fstr_setup_eigenread( ctrl, counter, P )
2634  !---- args
2635  integer(kind=kint) :: ctrl
2636  integer(kind=kint) :: counter
2637  type(fstr_param_pack) :: P
2638  !---- vals
2639  integer(kind=kint) :: filename_len
2640  character(len=HECMW_NAME_LEN) :: datafmt, ss
2641  !---- body
2642 
2643  filename_len = hecmw_filename_len
2644  write(ss,*) filename_len
2645  write(datafmt, '(a,a,a)') 'S', trim(adjustl(ss)), ' '
2646 
2647  if( fstr_ctrl_get_data_ex( ctrl, 1, datafmt, p%FREQ%eigenlog_filename ) /= 0) return
2648  if( fstr_ctrl_get_data_ex( ctrl, 2, 'ii ', p%FREQ%start_mode, p%FREQ%end_mode ) /= 0) return
2649 
2650  return
2651 
2652  end subroutine
2653 
2654  !-----------------------------------------------------------------------------!
2656  !-----------------------------------------------------------------------------!
2657 
2658  subroutine fstr_expand_dload_array( array, old_size, new_size )
2659  implicit none
2660  real(kind=kreal), pointer :: array(:,:)
2661  integer(kind=kint) :: old_size, new_size, i, j
2662  real(kind=kreal), pointer :: temp(:,:)
2663 
2664  if( old_size >= new_size ) then
2665  return
2666  end if
2667 
2668  if( associated( array ) ) then
2669  allocate(temp(0:6, old_size))
2670  temp = array
2671  deallocate(array)
2672  allocate(array(0:6, new_size))
2673  array = 0
2674  do i=1,old_size
2675  do j=0,6
2676  array(j,i) = temp(j,i)
2677  end do
2678  end do
2679  deallocate(temp)
2680  else
2681  allocate(array(0:6, new_size))
2682  array = 0
2683  end if
2684  end subroutine fstr_expand_dload_array
2685 
2687  subroutine fstr_setup_dload( ctrl, counter, P )
2688  implicit none
2689  integer(kind=kint) :: ctrl
2690  integer(kind=kint) :: counter
2691  type(fstr_param_pack) :: P
2692 
2693  integer(kind=kint) :: rcode
2694  character(HECMW_NAME_LEN) :: amp
2695  integer(kind=kint) :: amp_id
2696  integer(kind=kint) :: follow
2697  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
2698  real(kind=kreal),pointer :: new_params(:,:)
2699  logical,pointer :: fg_surface(:)
2700  integer(kind=kint),pointer :: lid_ptr(:)
2701  integer(kind=kint) :: i, j, n, old_size, new_size
2702  integer(kind=kint) :: gid
2703 
2704  if( p%SOLID%file_type /= kbcffstr ) return
2705 
2706  gid = 1
2707  rcode = fstr_ctrl_get_param_ex( ctrl, 'GRPID ', '# ', 0, 'I', gid )
2708 
2709  n = fstr_ctrl_get_data_line_n( ctrl )
2710  if( n == 0 ) return
2711  old_size = p%SOLID%DLOAD_ngrp_tot
2712  new_size = old_size + n
2713  p%SOLID%DLOAD_ngrp_tot = new_size
2714  ! Keiji Suemitsu (20140624) <
2715  call fstr_expand_integer_array ( p%SOLID%DLOAD_ngrp_GRPID, old_size, new_size )
2716  call fstr_expand_integer_array ( p%SOLID%DLOAD_ngrp_ID, old_size, new_size )
2717  call fstr_expand_integer_array ( p%SOLID%DLOAD_ngrp_LID, old_size, new_size )
2718  call fstr_expand_integer_array ( p%SOLID%DLOAD_ngrp_amp, old_size, new_size )
2719  call fstr_expand_dload_array ( p%SOLID%DLOAD_ngrp_params, old_size, new_size )
2720  ! > Keiji Suemitsu (20140624)
2721 
2722  allocate( grp_id_name(n))
2723  allocate( new_params(0:6,n))
2724  allocate( fg_surface(n))
2725  new_params = 0
2726  amp = ' '
2727  follow = p%SOLID%DLOAD_follow
2728  if( .not. p%PARAM%nlgeom ) follow = 0
2729  lid_ptr => p%SOLID%DLOAD_ngrp_LID(old_size+1:)
2730  rcode = fstr_ctrl_get_dload( ctrl, amp, follow, &
2731  grp_id_name, hecmw_name_len, &
2732  lid_ptr, new_params )
2733  if( rcode /= 0 ) call fstr_ctrl_err_stop
2734  call amp_name_to_id( p%MESH, '!DLOAD', amp, amp_id )
2735  p%SOLID%DLOAD_follow = follow
2736  do i=1,n
2737  p%SOLID%DLOAD_ngrp_amp(old_size+i) = amp_id
2738  do j=0, 6
2739  p%SOLID%DLOAD_ngrp_params(j,old_size+i) = new_params(j,i)
2740  end do
2741  fg_surface(i) = ( lid_ptr(i) == 100 )
2742  end do
2743  p%SOLID%DLOAD_ngrp_GRPID(old_size+1:new_size) = gid
2744  call dload_grp_name_to_id_ex( p%MESH, n, grp_id_name, fg_surface, p%SOLID%DLOAD_ngrp_ID(old_size+1:))
2745  deallocate( grp_id_name )
2746  deallocate( new_params )
2747  deallocate( fg_surface )
2748  end subroutine fstr_setup_dload
2749 
2750 
2751  !-----------------------------------------------------------------------------!
2753  !-----------------------------------------------------------------------------!
2754 
2755  subroutine fstr_setup_temperature( ctrl, counter, P )
2756  implicit none
2757  integer(kind=kint) :: ctrl
2758  integer(kind=kint) :: counter
2759  type(fstr_param_pack) :: P
2760 
2761  integer(kind=kint) :: rcode, gid
2762  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
2763  real(kind=kreal),pointer :: val_ptr(:)
2764  integer(kind=kint) :: n, old_size, new_size
2765 
2766  if( p%SOLID%file_type /= kbcffstr ) return
2767 
2768  gid = 1
2769  rcode = fstr_ctrl_get_param_ex( ctrl, 'GRPID ', '# ', 0, 'I', gid )
2770 
2771  n = fstr_ctrl_get_data_line_n( ctrl )
2772  old_size = p%SOLID%TEMP_ngrp_tot
2773  if( n > 0 ) then
2774  new_size = old_size + n
2775  else
2776  new_size = old_size + 1
2777  endif
2778  call fstr_expand_integer_array ( p%SOLID%TEMP_ngrp_GRPID, old_size, new_size )
2779  call fstr_expand_integer_array ( p%SOLID%TEMP_ngrp_ID, old_size, new_size )
2780  call fstr_expand_real_array ( p%SOLID%TEMP_ngrp_val,old_size, new_size )
2781 
2782  allocate( grp_id_name(n))
2783  val_ptr => p%SOLID%TEMP_ngrp_val( old_size+1: )
2784 
2785  rcode = fstr_ctrl_get_temperature( ctrl, &
2786  p%SOLID%TEMP_irres, &
2787  p%SOLID%TEMP_tstep, &
2788  p%SOLID%TEMP_interval, &
2789  p%SOLID%TEMP_rtype, &
2790  grp_id_name, hecmw_name_len, &
2791  val_ptr )
2792  if( rcode /= 0 ) call fstr_ctrl_err_stop
2793 
2794  p%SOLID%TEMP_ngrp_GRPID(old_size+1:new_size) = gid
2795  if( n > 0 ) then
2796  if( p%SOLID%TEMP_irres == 0 ) then
2797  p%SOLID%TEMP_ngrp_tot = new_size
2798  call node_grp_name_to_id_ex( p%MESH, '!TEMPERATURE', &
2799  n, grp_id_name, p%SOLID%TEMP_ngrp_ID(old_size+1:))
2800  endif
2801  deallocate( grp_id_name )
2802  endif
2803 
2804  end subroutine fstr_setup_temperature
2805 
2806 
2807  !-----------------------------------------------------------------------------!
2809  !-----------------------------------------------------------------------------!
2810 
2811  subroutine fstr_setup_spring( ctrl, counter, P )
2812  implicit none
2813  integer(kind=kint) :: ctrl
2814  integer(kind=kint) :: counter
2815  type(fstr_param_pack) :: P
2816 
2817  integer(kind=kint) :: rcode
2818  character(HECMW_NAME_LEN) :: amp
2819  integer(kind=kint) :: amp_id
2820  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
2821  real(kind=kreal),pointer :: val_ptr(:)
2822  integer(kind=kint),pointer :: id_ptr(:)
2823  integer(kind=kint) :: i, n, old_size, new_size
2824  integer(kind=kint) :: gid
2825 
2826  if( p%SOLID%file_type /= kbcffstr ) return
2827  gid = 1
2828  rcode = fstr_ctrl_get_param_ex( ctrl, 'GRPID ', '# ', 0, 'I', gid )
2829  n = fstr_ctrl_get_data_line_n( ctrl )
2830  if( n == 0 ) return
2831  old_size = p%SOLID%SPRING_ngrp_tot
2832  new_size = old_size + n
2833  p%SOLID%SPRING_ngrp_tot = new_size
2834  call fstr_expand_integer_array ( p%SOLID%SPRING_ngrp_GRPID, old_size, new_size )
2835  call fstr_expand_integer_array ( p%SOLID%SPRING_ngrp_ID, old_size, new_size )
2836  call fstr_expand_integer_array ( p%SOLID%SPRING_ngrp_DOF, old_size, new_size )
2837  call fstr_expand_real_array ( p%SOLID%SPRING_ngrp_val, old_size, new_size )
2838  call fstr_expand_integer_array ( p%SOLID%SPRING_ngrp_amp, old_size, new_size )
2839 
2840  allocate( grp_id_name(n))
2841  amp = ' '
2842  val_ptr => p%SOLID%SPRING_ngrp_val(old_size+1:)
2843  id_ptr =>p%SOLID%SPRING_ngrp_DOF(old_size+1:)
2844  val_ptr = 0
2845  rcode = fstr_ctrl_get_spring( ctrl, amp, grp_id_name, hecmw_name_len, id_ptr, val_ptr )
2846  if( rcode /= 0 ) call fstr_ctrl_err_stop
2847 
2848  call amp_name_to_id( p%MESH, '!SPRING', amp, amp_id )
2849  do i=1,n
2850  p%SOLID%SPRING_ngrp_amp(old_size+i) = amp_id
2851  end do
2852  p%SOLID%SPRING_ngrp_GRPID(old_size+1:new_size) = gid
2853  call node_grp_name_to_id_ex( p%MESH, '!SPRING', n, grp_id_name, p%SOLID%SPRING_ngrp_ID(old_size+1:))
2854 
2855  deallocate( grp_id_name )
2856 
2857  end subroutine fstr_setup_spring
2858 
2859 
2860  !-----------------------------------------------------------------------------!
2862  !-----------------------------------------------------------------------------!
2863 
2864  subroutine fstr_setup_reftemp( ctrl, counter, P )
2865  implicit none
2866  integer(kind=kint) :: ctrl
2867  integer(kind=kint) :: counter
2868  type(fstr_param_pack) :: P
2869 
2870  integer(kind=kint) :: rcode
2871 
2872  rcode = fstr_ctrl_get_reftemp( ctrl, p%PARAM%ref_temp )
2873  if( rcode /= 0 ) call fstr_ctrl_err_stop
2874 
2875  end subroutine fstr_setup_reftemp
2876 
2877 
2878  !*****************************************************************************!
2879  !* HEADERS FOR HEAT ANALYSIS *************************************************!
2880  !*****************************************************************************!
2881 
2882  !-----------------------------------------------------------------------------!
2884  !-----------------------------------------------------------------------------!
2885 
2886  subroutine fstr_setup_heat( ctrl, counter, P )
2887  implicit none
2888  integer(kind=kint) :: ctrl
2889  integer(kind=kint) :: counter
2890  type(fstr_param_pack) :: P
2891 
2892  integer(kind=kint) :: rcode
2893  integer(kind=kint) :: n
2894  character(len=HECMW_NAME_LEN) :: mName
2895  integer(kind=kint) :: i
2896 
2897  n = fstr_ctrl_get_data_line_n( ctrl )
2898 
2899  if( n == 0 ) return
2900 
2901  call reallocate_real( p%PARAM%dtime, n)
2902  call reallocate_real( p%PARAM%etime, n)
2903  call reallocate_real( p%PARAM%dtmin, n)
2904  call reallocate_real( p%PARAM%delmax,n)
2905  call reallocate_integer( p%PARAM%itmax, n)
2906  call reallocate_real( p%PARAM%eps, n)
2907  p%PARAM%analysis_n = n
2908 
2909  p%PARAM%dtime = 0
2910  p%PARAM%etime = 0
2911  p%PARAM%dtmin = 0
2912  p%PARAM%delmax = 0
2913  p%PARAM%itmax = 20
2914  p%PARAM%eps = 1.0e-6
2915  p%PARAM%timepoint_id = 0
2916 
2917  rcode = fstr_ctrl_get_heat( ctrl, &
2918  p%PARAM%dtime, &
2919  p%PARAM%etime, &
2920  p%PARAM%dtmin, &
2921  p%PARAM%delmax, &
2922  p%PARAM%itmax, &
2923  p%PARAM%eps, &
2924  mname, &
2925  p%HEAT%beta)
2926  if( rcode /= 0 ) then
2927  call fstr_ctrl_err_stop
2928  end if
2929 
2930  if( associated(p%PARAM%timepoints) ) then
2931  do i=1,size(p%PARAM%timepoints)
2932  if( fstr_streqr( p%PARAM%timepoints(i)%name, mname ) ) then
2933  p%PARAM%timepoint_id = i; exit
2934  endif
2935  enddo
2936  endif
2937 
2938  call reallocate_real( p%HEAT%STEP_DLTIME, n)
2939  call reallocate_real( p%HEAT%STEP_EETIME, n)
2940  call reallocate_real( p%HEAT%STEP_DELMIN, n)
2941  call reallocate_real( p%HEAT%STEP_DELMAX, n)
2942  p%HEAT%STEPtot = n
2943 
2944  p%HEAT%STEP_DLTIME = p%PARAM%dtime
2945  p%HEAT%STEP_EETIME = p%PARAM%etime
2946  p%HEAT%STEP_DELMIN = p%PARAM%dtmin
2947  p%HEAT%STEP_DELMAX = p%PARAM%delmax
2948  p%HEAT%timepoint_id = p%PARAM%timepoint_id
2949 
2950  end subroutine fstr_setup_heat
2951 
2952  !-----------------------------------------------------------------------------!
2954  !-----------------------------------------------------------------------------!
2955 
2956  subroutine fstr_setup_fixtemp( ctrl, counter, P )
2957  implicit none
2958  integer(kind=kint) :: ctrl
2959  integer(kind=kint) :: counter
2960  type(fstr_param_pack),target :: P
2961 
2962  integer(kind=kint) :: rcode
2963  character(HECMW_NAME_LEN) :: amp
2964  integer(kind=kint) :: amp_id
2965  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
2966  real(kind=kreal),pointer :: value(:)
2967  integer(kind=kint) :: i, j, n, m, head, id, member_n, old_size, new_size
2968  integer(kind=kint),pointer :: member(:)
2969  integer(kind=kint) :: local_id, rtc
2970  ! ------------------------------------------------
2971 
2972  n = fstr_ctrl_get_data_line_n( ctrl )
2973  if( n == 0 ) return
2974 
2975  allocate( grp_id_name(n))
2976  allocate( value(n))
2977 
2978  amp = ' '
2979  rcode = fstr_ctrl_get_fixtemp( ctrl, amp, &
2980  grp_id_name, hecmw_name_len, value )
2981  if( rcode /= 0 ) call fstr_ctrl_err_stop
2982 
2983  call amp_name_to_id( p%MESH, '!FIXTEMP', amp, amp_id )
2984 
2985  m = 0
2986  do i = 1, n
2987  !rtc = get_local_member_index( P%MESH, 'node', grp_id_name(i), local_id )
2988  rtc = get_sorted_local_member_index( p%MESH, p%PARAM, 'node', grp_id_name(i), local_id )
2989  if( rtc > 0 ) then
2990  m = m + 1
2991  else if( rtc < 0 ) then
2992  m = m + get_grp_member_n( p%MESH, 'node_grp', grp_id_name(i) )
2993  end if
2994  end do
2995 
2996  if (m == 0) then
2997  deallocate( grp_id_name )
2998  deallocate( value )
2999  return
3000  endif
3001 
3002  ! JP-8
3003  old_size = p%HEAT%T_FIX_tot
3004  new_size = old_size + m
3005  call fstr_expand_integer_array( p%HEAT%T_FIX_node, old_size, new_size )
3006  call fstr_expand_integer_array( p%HEAT%T_FIX_ampl, old_size, new_size )
3007  call fstr_expand_real_array( p%HEAT%T_FIX_val, old_size, new_size )
3008  p%HEAT%T_FIX_tot = new_size
3009 
3010  head = old_size + 1
3011  member => p%HEAT%T_FIX_node(head:)
3012  id = head
3013  do i = 1, n
3014  !rtc = get_local_member_index( P%MESH, 'node', grp_id_name(i), local_id )
3015  rtc = get_sorted_local_member_index( p%MESH, p%PARAM, 'node', grp_id_name(i), local_id )
3016  if( rtc > 0 ) then
3017  member(1) = local_id
3018  member_n = 1
3019  else if( rtc < 0 ) then
3020  member_n = get_grp_member( p%MESH, 'node_grp', grp_id_name(i), member )
3021  else
3022  cycle
3023  end if
3024  if( i<n ) then
3025  member => member( member_n+1 : )
3026  endif
3027  do j = 1, member_n
3028  p%HEAT%T_FIX_val (id) = value(i)
3029  p%HEAT%T_FIX_ampl (id) = amp_id
3030  id = id + 1
3031  end do
3032  end do
3033 
3034  deallocate( grp_id_name )
3035  deallocate( value )
3036  end subroutine fstr_setup_fixtemp
3037 
3038 
3039  !-----------------------------------------------------------------------------!
3041  !-----------------------------------------------------------------------------!
3042 
3043  subroutine fstr_setup_cflux( ctrl, counter, P )
3044  implicit none
3045  integer(kind=kint) :: ctrl
3046  integer(kind=kint) :: counter
3047  type(fstr_param_pack) :: P
3048 
3049  integer(kind=kint) :: rcode
3050  character(HECMW_NAME_LEN) :: amp
3051  integer(kind=kint) :: amp_id
3052  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
3053  real(kind=kreal),pointer :: value(:)
3054  integer(kind=kint) :: i, j, n, m, head, id, member_n, old_size, new_size
3055  integer(kind=kint),pointer :: member(:)
3056  integer(kind=kint) :: local_id, rtc
3057  ! ------------------------------------------------
3058 
3059  n = fstr_ctrl_get_data_line_n( ctrl )
3060  if( n == 0 ) return
3061 
3062  allocate( grp_id_name(n))
3063  allocate( value(n))
3064 
3065  amp = ' '
3066  rcode = fstr_ctrl_get_cflux( ctrl, amp, &
3067  grp_id_name, hecmw_name_len, value )
3068  if( rcode /= 0 ) call fstr_ctrl_err_stop
3069 
3070  call amp_name_to_id( p%MESH, '!CFLUX', amp, amp_id )
3071 
3072  m = 0
3073 
3074  do i = 1, n
3075  rtc = get_local_member_index( p%MESH, 'node', grp_id_name(i), local_id )
3076  if( rtc > 0 ) then
3077  m = m + 1
3078  else if( rtc < 0 ) then
3079  m = m + get_grp_member_n( p%MESH, 'node_grp', grp_id_name(i) )
3080  end if
3081  end do
3082 
3083  if (m == 0) then
3084  deallocate( grp_id_name )
3085  deallocate( value )
3086  return
3087  endif
3088 
3089  ! JP-9
3090  old_size = p%HEAT%Q_NOD_tot
3091  new_size = old_size + m
3092  call fstr_expand_integer_array( p%HEAT%Q_NOD_node, old_size, new_size )
3093  call fstr_expand_integer_array( p%HEAT%Q_NOD_ampl, old_size, new_size )
3094  call fstr_expand_real_array( p%HEAT%Q_NOD_val, old_size, new_size )
3095  p%HEAT%Q_NOD_tot = new_size
3096 
3097  head = old_size + 1
3098  member => p%HEAT%Q_NOD_node(head:)
3099  id = head
3100  do i = 1, n
3101  rtc = get_local_member_index( p%MESH, 'node', grp_id_name(i), local_id )
3102  if( rtc > 0 ) then
3103  member(1) = local_id
3104  member_n = 1
3105  else if( rtc < 0 ) then
3106  member_n = get_grp_member( p%MESH, 'node_grp', grp_id_name(i), member )
3107  else
3108  cycle
3109  end if
3110  if( i<n ) member => member( member_n+1 : )
3111  do j = 1, member_n
3112  p%HEAT%Q_NOD_val (id) = value(i)
3113  p%HEAT%Q_NOD_ampl (id) = amp_id
3114  id = id + 1
3115  end do
3116  end do
3117 
3118  deallocate( grp_id_name )
3119  deallocate( value )
3120  end subroutine fstr_setup_cflux
3121 
3122 
3123  !-----------------------------------------------------------------------------!
3125  !-----------------------------------------------------------------------------!
3126 
3127 
3128  subroutine fstr_setup_dflux( ctrl, counter, P )
3129  implicit none
3130  integer(kind=kint) :: ctrl
3131  integer(kind=kint) :: counter
3132  type(fstr_param_pack) :: P
3133 
3134  integer(kind=kint) :: rcode
3135  character(HECMW_NAME_LEN) :: amp
3136  integer(kind=kint) :: amp_id
3137  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
3138  integer(kind=kint),pointer :: load_type(:)
3139  real(kind=kreal),pointer :: value(:)
3140  integer(kind=kint) :: i, j, n, m, head, id, member_n, old_size, new_size
3141  integer(kind=kint),pointer :: member(:)
3142  integer(kind=kint) :: local_id, rtc
3143  ! ------------------------------------------------
3144 
3145  n = fstr_ctrl_get_data_line_n( ctrl )
3146  if( n == 0 ) return
3147 
3148  allocate( grp_id_name(n))
3149  allocate( load_type(n))
3150  allocate( value(n))
3151 
3152  amp = ' '
3153  rcode = fstr_ctrl_get_dflux( ctrl, amp, &
3154  grp_id_name, hecmw_name_len, load_type, value )
3155  if( rcode /= 0 ) call fstr_ctrl_err_stop
3156 
3157  call amp_name_to_id( p%MESH, '!DFLUX', amp, amp_id )
3158 
3159  m = 0
3160  do i = 1, n
3161  rtc = get_local_member_index( p%MESH, 'element', grp_id_name(i), local_id )
3162  if( rtc > 0 ) then
3163  m = m + 1
3164  else if( rtc < 0 ) then
3165  m = m + get_grp_member_n( p%MESH, 'elem_grp', grp_id_name(i) )
3166  end if
3167  end do
3168 
3169  if (m == 0) then
3170  deallocate( grp_id_name )
3171  deallocate( load_type )
3172  deallocate( value )
3173  return
3174  endif
3175 
3176  ! JP-10
3177  old_size = p%HEAT%Q_SUF_tot
3178  new_size = old_size + m
3179  call fstr_expand_integer_array( p%HEAT%Q_SUF_elem, old_size, new_size )
3180  call fstr_expand_integer_array( p%HEAT%Q_SUF_ampl, old_size, new_size )
3181  call fstr_expand_integer_array( p%HEAT%Q_SUF_surf, old_size, new_size )
3182  call fstr_expand_real_array( p%HEAT%Q_SUF_val, old_size, new_size )
3183  p%HEAT%Q_SUF_tot = new_size
3184 
3185  head = old_size + 1
3186  member => p%HEAT%Q_SUF_elem(head:)
3187  id = head
3188  do i = 1, n
3189  rtc = get_local_member_index( p%MESH, 'element', grp_id_name(i), local_id )
3190  if( rtc > 0 ) then
3191  member(1) = local_id
3192  member_n = 1
3193  else if( rtc < 0 ) then
3194  member_n = get_grp_member( p%MESH, 'elem_grp', grp_id_name(i), member )
3195  else
3196  cycle
3197  end if
3198  if( i<n ) member => member( member_n+1 : )
3199  do j = 1, member_n
3200  p%HEAT%Q_SUF_surf (id) = load_type(i)
3201  p%HEAT%Q_SUF_val (id) = value(i)
3202  p%HEAT%Q_SUF_ampl (id) = amp_id
3203  id = id + 1
3204  end do
3205  end do
3206 
3207  deallocate( grp_id_name )
3208  deallocate( load_type )
3209  deallocate( value )
3210  end subroutine fstr_setup_dflux
3211 
3212 
3213  !-----------------------------------------------------------------------------!
3215  !-----------------------------------------------------------------------------!
3216 
3217 
3218  subroutine fstr_setup_sflux( ctrl, counter, P )
3219  implicit none
3220  integer(kind=kint) :: ctrl
3221  integer(kind=kint) :: counter
3222  type(fstr_param_pack) :: P
3223 
3224  integer(kind=kint) :: rcode
3225  character(HECMW_NAME_LEN) :: amp
3226  integer(kind=kint) :: amp_id
3227  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
3228  real(kind=kreal),pointer :: value(:)
3229  integer(kind=kint) :: i, j, n, m, head, id, member_n, old_size, new_size
3230  integer(kind=kint),pointer :: member1(:), member2(:)
3231  ! ------------------------------------------------
3232 
3233  n = fstr_ctrl_get_data_line_n( ctrl )
3234  if( n == 0 ) return
3235 
3236  allocate( grp_id_name(n))
3237  allocate( value(n))
3238 
3239  amp = ' '
3240  rcode = fstr_ctrl_get_sflux( ctrl, amp, &
3241  grp_id_name, hecmw_name_len, value )
3242  if( rcode /= 0 ) call fstr_ctrl_err_stop
3243 
3244  call amp_name_to_id( p%MESH, '!SFLUX', amp, amp_id )
3245 
3246  m = 0
3247  do i = 1, n
3248  m = m + get_grp_member_n( p%MESH, 'surf_grp', grp_id_name(i) )
3249  end do
3250 
3251  if (m == 0) then
3252  deallocate( grp_id_name )
3253  deallocate( value )
3254  return
3255  endif
3256 
3257  ! JP-11
3258  old_size = p%HEAT%Q_SUF_tot
3259  new_size = old_size + m
3260  call fstr_expand_integer_array( p%HEAT%Q_SUF_elem, old_size, new_size )
3261  call fstr_expand_integer_array( p%HEAT%Q_SUF_ampl, old_size, new_size )
3262  call fstr_expand_integer_array( p%HEAT%Q_SUF_surf, old_size, new_size )
3263  call fstr_expand_real_array( p%HEAT%Q_SUF_val, old_size, new_size )
3264  p%HEAT%Q_SUF_tot = new_size
3265 
3266  head = old_size + 1
3267  member1 => p%HEAT%Q_SUF_elem(head:)
3268  member2 => p%HEAT%Q_SUF_surf(head:)
3269  id = head
3270  do i = 1, n
3271  member_n = get_grp_member( p%MESH, 'surf_grp', grp_id_name(i), member1, member2 )
3272  if( i<n ) then
3273  member1 => member1( member_n+1 : )
3274  member2 => member2( member_n+1 : )
3275  end if
3276  do j = 1, member_n
3277  p%HEAT%Q_SUF_val (id) = value(i)
3278  p%HEAT%Q_SUF_ampl (id) = amp_id
3279  id = id + 1
3280  end do
3281  end do
3282 
3283  deallocate( grp_id_name )
3284  deallocate( value )
3285  end subroutine fstr_setup_sflux
3286 
3287 
3288  !-----------------------------------------------------------------------------!
3290  !-----------------------------------------------------------------------------!
3291 
3292 
3293  subroutine fstr_setup_film( ctrl, counter, P )
3294  implicit none
3295  integer(kind=kint) :: ctrl
3296  integer(kind=kint) :: counter
3297  type(fstr_param_pack) :: P
3298 
3299  integer(kind=kint) :: rcode
3300  character(HECMW_NAME_LEN) :: amp1, amp2
3301  integer(kind=kint) :: amp_id1, amp_id2
3302  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
3303  integer(kind=kint),pointer :: load_type(:)
3304  real(kind=kreal),pointer :: value(:)
3305  real(kind=kreal),pointer :: shink(:)
3306  integer(kind=kint) :: i, j, n, m, head, id, member_n, old_size, new_size
3307  integer(kind=kint),pointer :: member(:)
3308  integer(kind=kint) :: local_id, rtc
3309  ! ------------------------------------------------
3310 
3311  n = fstr_ctrl_get_data_line_n( ctrl )
3312  if( n == 0 ) return
3313 
3314  allocate( grp_id_name(n))
3315  allocate( load_type(n))
3316  allocate( value(n))
3317  allocate( shink(n))
3318 
3319  amp1 = ' '
3320  amp2 = ' '
3321 
3322  rcode = fstr_ctrl_get_film( ctrl, amp1, amp2, &
3323  grp_id_name, hecmw_name_len, load_type, value, shink )
3324  if( rcode /= 0 ) call fstr_ctrl_err_stop
3325 
3326  call amp_name_to_id( p%MESH, '!FILM', amp1, amp_id1 )
3327  call amp_name_to_id( p%MESH, '!FILM', amp2, amp_id2 )
3328 
3329  m = 0
3330  do i = 1, n
3331  rtc = get_local_member_index( p%MESH, 'element', grp_id_name(i), local_id )
3332  if( rtc > 0 ) then
3333  m = m + 1
3334  else if( rtc < 0 ) then
3335  m = m + get_grp_member_n( p%MESH, 'elem_grp', grp_id_name(i) )
3336  end if
3337  end do
3338 
3339  if (m == 0) then
3340  deallocate( grp_id_name )
3341  deallocate( load_type )
3342  deallocate( value )
3343  deallocate( shink )
3344  return
3345  endif
3346 
3347  ! JP-12
3348  old_size = p%HEAT%H_SUF_tot
3349  new_size = old_size + m
3350  call fstr_expand_integer_array( p%HEAT%H_SUF_elem, old_size, new_size )
3351  call fstr_expand_integer_array2( p%HEAT%H_SUF_ampl, 2, old_size, new_size )
3352  call fstr_expand_integer_array( p%HEAT%H_SUF_surf, old_size, new_size )
3353  call fstr_expand_real_array2( p%HEAT%H_SUF_val, 2, old_size, new_size )
3354  p%HEAT%H_SUF_tot = new_size
3355 
3356  head = old_size + 1
3357  member => p%HEAT%H_SUF_elem(head:)
3358  id = head
3359  do i = 1, n
3360  rtc = get_local_member_index( p%MESH, 'element', grp_id_name(i), local_id )
3361  if( rtc > 0 ) then
3362  member(1) = local_id
3363  member_n = 1
3364  else if( rtc < 0 ) then
3365  member_n = get_grp_member( p%MESH, 'elem_grp', grp_id_name(i), member )
3366  else
3367  cycle
3368  end if
3369  if( i<n ) member => member( member_n+1 : )
3370  do j = 1, member_n
3371  p%HEAT%H_SUF_surf (id) = load_type(i)
3372  p%HEAT%H_SUF_val (id,1) = value(i)
3373  p%HEAT%H_SUF_val (id,2) = shink(i)
3374  p%HEAT%H_SUF_ampl (id,1) = amp_id1
3375  p%HEAT%H_SUF_ampl (id,2) = amp_id2
3376  id= id + 1
3377  end do
3378  end do
3379 
3380  deallocate( grp_id_name )
3381  deallocate( load_type )
3382  deallocate( value )
3383  deallocate( shink )
3384  end subroutine fstr_setup_film
3385 
3386 
3387  !-----------------------------------------------------------------------------!
3389  !-----------------------------------------------------------------------------!
3390 
3391 
3392  subroutine fstr_setup_sfilm( ctrl, counter, P )
3393  implicit none
3394  integer(kind=kint) :: ctrl
3395  integer(kind=kint) :: counter
3396  type(fstr_param_pack) :: P
3397 
3398  integer(kind=kint) :: rcode
3399  character(HECMW_NAME_LEN) :: amp1, amp2
3400  integer(kind=kint) :: amp_id1, amp_id2
3401  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
3402  real(kind=kreal),pointer :: value(:)
3403  real(kind=kreal),pointer :: shink(:)
3404  integer(kind=kint) :: i, j, n, m, head, id, member_n, old_size, new_size
3405  integer(kind=kint),pointer :: member1(:), member2(:)
3406  ! ------------------------------------------------
3407 
3408  n = fstr_ctrl_get_data_line_n( ctrl )
3409  if( n == 0 ) return
3410 
3411  allocate( grp_id_name(n))
3412  allocate( value(n))
3413  allocate( shink(n))
3414 
3415  amp1 = ' '
3416  amp2 = ' '
3417  rcode = fstr_ctrl_get_sfilm( ctrl, amp1, amp2, &
3418  grp_id_name, hecmw_name_len, value, shink )
3419  if( rcode /= 0 ) call fstr_ctrl_err_stop
3420 
3421  call amp_name_to_id( p%MESH, '!SFILM', amp1, amp_id1 )
3422  call amp_name_to_id( p%MESH, '!SFILM', amp2, amp_id2 )
3423 
3424  m = 0
3425  do i = 1, n
3426  m = m + get_grp_member_n( p%MESH, 'surf_grp', grp_id_name(i) )
3427  end do
3428 
3429  if (m == 0) then
3430  deallocate( grp_id_name )
3431  deallocate( value )
3432  deallocate( shink )
3433  return
3434  endif
3435 
3436  ! JP-13
3437  old_size = p%HEAT%H_SUF_tot
3438  new_size = old_size + m
3439  call fstr_expand_integer_array( p%HEAT%H_SUF_elem, old_size, new_size )
3440  call fstr_expand_integer_array2( p%HEAT%H_SUF_ampl, 2, old_size, new_size )
3441  call fstr_expand_integer_array( p%HEAT%H_SUF_surf, old_size, new_size )
3442  call fstr_expand_real_array2( p%HEAT%H_SUF_val, 2, old_size, new_size )
3443  p%HEAT%H_SUF_tot = new_size
3444 
3445  head = old_size + 1
3446  member1 => p%HEAT%H_SUF_elem(head:)
3447  member2 => p%HEAT%H_SUF_surf(head:)
3448  id = head
3449  do i = 1, n
3450  member_n = get_grp_member( p%MESH, 'surf_grp', grp_id_name(i), member1, member2 )
3451  if( i<n ) then
3452  member1 => member1( member_n+1 : )
3453  member2 => member2( member_n+1 : )
3454  end if
3455  do j = 1, member_n
3456  p%HEAT%H_SUF_val (id,1) = value(i)
3457  p%HEAT%H_SUF_val (id,2) = shink(i)
3458  p%HEAT%H_SUF_ampl (id,1) = amp_id1
3459  p%HEAT%H_SUF_ampl (id,2) = amp_id2
3460  id = id + 1
3461  end do
3462  end do
3463 
3464  deallocate( grp_id_name )
3465  deallocate( value )
3466  deallocate( shink )
3467  end subroutine fstr_setup_sfilm
3468 
3469 
3470  !-----------------------------------------------------------------------------!
3472  !-----------------------------------------------------------------------------!
3473 
3474 
3475  subroutine fstr_setup_radiate( ctrl, counter, P )
3476  implicit none
3477  integer(kind=kint) :: ctrl
3478  integer(kind=kint) :: counter
3479  type(fstr_param_pack) :: P
3480 
3481  integer(kind=kint) :: rcode
3482  character(HECMW_NAME_LEN) :: amp1, amp2
3483  integer(kind=kint) :: amp_id1, amp_id2
3484  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
3485  integer(kind=kint),pointer :: load_type(:)
3486  real(kind=kreal),pointer :: value(:)
3487  real(kind=kreal),pointer :: shink(:)
3488  integer(kind=kint) :: i, j, n, m, head, id, member_n, old_size, new_size
3489  integer(kind=kint),pointer :: member(:)
3490  integer(kind=kint) :: local_id, rtc
3491  ! ------------------------------------------------
3492 
3493  n = fstr_ctrl_get_data_line_n( ctrl )
3494  if( n == 0 ) return
3495 
3496  allocate( grp_id_name(n))
3497  allocate( load_type(n))
3498  allocate( value(n))
3499  allocate( shink(n))
3500 
3501  amp1 = ' '
3502  amp2 = ' '
3503  rcode = fstr_ctrl_get_radiate( ctrl, amp1, amp2, &
3504  grp_id_name, hecmw_name_len, load_type, value, shink )
3505  if( rcode /= 0 ) call fstr_ctrl_err_stop
3506 
3507  call amp_name_to_id( p%MESH, '!RADIATE', amp1, amp_id1 )
3508  call amp_name_to_id( p%MESH, '!RADIATE', amp2, amp_id2 )
3509 
3510  m = 0
3511  do i = 1, n
3512  rtc = get_local_member_index( p%MESH, 'element', grp_id_name(i), local_id )
3513  if( rtc > 0 ) then
3514  m = m + 1
3515  else if( rtc < 0 ) then
3516  m = m + get_grp_member_n( p%MESH, 'elem_grp', grp_id_name(i) )
3517  end if
3518  end do
3519 
3520  if (m == 0) then
3521  deallocate( grp_id_name )
3522  deallocate( load_type )
3523  deallocate( value )
3524  deallocate( shink )
3525  return
3526  endif
3527 
3528  ! JP-14
3529  old_size = p%HEAT%R_SUF_tot
3530  new_size = old_size + m
3531  call fstr_expand_integer_array( p%HEAT%R_SUF_elem, old_size, new_size )
3532  call fstr_expand_integer_array2( p%HEAT%R_SUF_ampl, 2, old_size, new_size )
3533  call fstr_expand_integer_array( p%HEAT%R_SUF_surf, old_size, new_size )
3534  call fstr_expand_real_array2( p%HEAT%R_SUF_val, 2, old_size, new_size )
3535  p%HEAT%R_SUF_tot = new_size
3536 
3537  head = old_size + 1
3538  member => p%HEAT%R_SUF_elem(head:)
3539  id = head
3540  do i = 1, n
3541  rtc = get_local_member_index( p%MESH, 'element', grp_id_name(i), local_id )
3542  if( rtc > 0 ) then
3543  member(1) = local_id
3544  member_n = 1
3545  else if( rtc < 0 ) then
3546  member_n = get_grp_member( p%MESH, 'elem_grp', grp_id_name(i), member )
3547  else
3548  cycle
3549  end if
3550  if( i<n ) member => member( member_n+1 : )
3551  do j = 1, member_n
3552  p%HEAT%R_SUF_surf (id) = load_type(i)
3553  p%HEAT%R_SUF_val (id,1) = value(i)
3554  p%HEAT%R_SUF_val (id,2) = shink(i)
3555  p%HEAT%R_SUF_ampl (id,1) = amp_id1
3556  p%HEAT%R_SUF_ampl (id,2) = amp_id2
3557  id = id + 1
3558  end do
3559  end do
3560 
3561  deallocate( grp_id_name )
3562  deallocate( load_type )
3563  deallocate( value )
3564  deallocate( shink )
3565  end subroutine fstr_setup_radiate
3566 
3567 
3568  !-----------------------------------------------------------------------------!
3570  !-----------------------------------------------------------------------------!
3571 
3572 
3573  subroutine fstr_setup_sradiate( ctrl, counter, P )
3574  implicit none
3575  integer(kind=kint) :: ctrl
3576  integer(kind=kint) :: counter
3577  type(fstr_param_pack) :: P
3578 
3579  integer(kind=kint) :: rcode
3580  character(HECMW_NAME_LEN) :: amp1, amp2
3581  integer(kind=kint) :: amp_id1, amp_id2
3582  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
3583  real(kind=kreal),pointer :: value(:)
3584  real(kind=kreal),pointer :: shink(:)
3585  integer(kind=kint) :: i, j, n, m, head, id, member_n, old_size, new_size
3586  integer(kind=kint),pointer :: member1(:), member2(:)
3587  ! ------------------------------------------------
3588 
3589  n = fstr_ctrl_get_data_line_n( ctrl )
3590  if( n == 0 ) return
3591 
3592  allocate( grp_id_name(n))
3593  allocate( value(n))
3594  allocate( shink(n))
3595 
3596  amp1 = ' '
3597  amp2 = ' '
3598  rcode = fstr_ctrl_get_sradiate( ctrl, amp1, amp2, grp_id_name, hecmw_name_len, value, shink )
3599  if( rcode /= 0 ) call fstr_ctrl_err_stop
3600 
3601  call amp_name_to_id( p%MESH, '!SRADIATE', amp1, amp_id1 )
3602  call amp_name_to_id( p%MESH, '!SRADIATE', amp2, amp_id2 )
3603 
3604  m = 0
3605  do i = 1, n
3606  m = m + get_grp_member_n( p%MESH, 'surf_grp', grp_id_name(i) )
3607  end do
3608 
3609  if (m == 0) then
3610  deallocate( grp_id_name )
3611  deallocate( value )
3612  deallocate( shink )
3613  return
3614  endif
3615 
3616  ! JP-15
3617  old_size = p%HEAT%R_SUF_tot
3618  new_size = old_size + m
3619  call fstr_expand_integer_array( p%HEAT%R_SUF_elem, old_size, new_size )
3620  call fstr_expand_integer_array2( p%HEAT%R_SUF_ampl, 2, old_size, new_size )
3621  call fstr_expand_integer_array( p%HEAT%R_SUF_surf, old_size, new_size )
3622  call fstr_expand_real_array2( p%HEAT%R_SUF_val, 2, old_size, new_size )
3623  p%HEAT%R_SUF_tot = new_size
3624 
3625  head = old_size + 1
3626  member1 => p%HEAT%R_SUF_elem(head:)
3627  member2 => p%HEAT%R_SUF_surf(head:)
3628  id = head
3629  do i = 1, n
3630  member_n = get_grp_member( p%MESH, 'surf_grp', grp_id_name(i), member1, member2 )
3631  if( i<n ) then
3632  member1 => member1( member_n+1 : )
3633  member2 => member2( member_n+1 : )
3634  end if
3635  do j = 1, member_n
3636  p%HEAT%R_SUF_val (id,1) = value(i)
3637  p%HEAT%R_SUF_val (id,2) = shink(i)
3638  p%HEAT%R_SUF_ampl (id,1) = amp_id1
3639  p%HEAT%R_SUF_ampl (id,2) = amp_id2
3640  id = id + 1
3641  end do
3642  end do
3643 
3644  deallocate( grp_id_name )
3645  deallocate( value )
3646  deallocate( shink )
3647  end subroutine fstr_setup_sradiate
3648 
3649 
3650  !*****************************************************************************!
3651  !* HEADERS FOR EIGEN ANALYSIS ************************************************!
3652  !*****************************************************************************!
3653 
3654  !-----------------------------------------------------------------------------!
3656  !-----------------------------------------------------------------------------!
3657 
3658  subroutine fstr_setup_eigen( ctrl, counter, P )
3659  implicit none
3660  integer(kind=kint) :: ctrl
3661  integer(kind=kint) :: counter
3662  type(fstr_param_pack) :: P
3663 
3664  integer(kind=kint) :: rcode
3665 
3666  rcode = fstr_ctrl_get_eigen( ctrl, p%EIGEN%nget, p%EIGEN%tolerance, p%EIGEN%maxiter)
3667  if( rcode /= 0) call fstr_ctrl_err_stop
3668 
3669  end subroutine fstr_setup_eigen
3670 
3671 
3672  !*****************************************************************************!
3673  !* HEADERS FOR DYNAMIC ANALYSIS **********************************************!
3674  !*****************************************************************************!
3675 
3676  !-----------------------------------------------------------------------------!
3678  !-----------------------------------------------------------------------------!
3679 
3680  subroutine fstr_setup_dynamic( ctrl, counter, P )
3681  implicit none
3682  integer(kind=kint) :: ctrl
3683  integer(kind=kint) :: counter
3684  type(fstr_param_pack) :: P
3685  integer(kind=kint) :: rcode
3686  character(HECMW_NAME_LEN) :: grp_id_name(1)
3687  integer(kind=kint) :: grp_id(1)
3688 
3689  rcode = fstr_ctrl_get_dynamic( ctrl, &
3690  p%PARAM%nlgeom, &
3691  p%DYN%idx_eqa, &
3692  p%DYN%idx_resp,&
3693  p%DYN%n_step, &
3694  p%DYN%t_start, &
3695  p%DYN%t_end, &
3696  p%DYN%t_delta, &
3697  p%DYN%gamma, &
3698  p%DYN%beta, &
3699  p%DYN%idx_mas, &
3700  p%DYN%idx_dmp, &
3701  p%DYN%ray_m, &
3702  p%DYN%ray_k, &
3703  p%DYN%nout, &
3704  grp_id_name(1), hecmw_name_len, &
3705  p%DYN%nout_monit, &
3706  p%DYN%iout_list )
3707 
3708  if( rcode /= 0) call fstr_ctrl_err_stop
3709 
3710  if (p%DYN%idx_resp == 1) then
3711  call node_grp_name_to_id_ex( p%MESH, '!DYNAMIC', 1, grp_id_name, grp_id)
3712  p%DYN%ngrp_monit = grp_id(1)
3713  else
3714  read(grp_id_name,*) p%DYN%ngrp_monit
3715  endif
3716 
3717  end subroutine fstr_setup_dynamic
3718 
3719 
3720  !-----------------------------------------------------------------------------!
3722  !-----------------------------------------------------------------------------!
3723 
3724  subroutine fstr_setup_velocity( ctrl, counter, P )
3725  implicit none
3726  integer(kind=kint) :: ctrl
3727  integer(kind=kint) :: counter
3728  type(fstr_param_pack) :: P
3729 
3730  integer(kind=kint) :: rcode
3731  integer(kind=kint) :: vType
3732  character(HECMW_NAME_LEN) :: amp
3733  integer(kind=kint) :: amp_id
3734  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
3735  integer(kind=kint),pointer :: dof_ids (:)
3736  integer(kind=kint),pointer :: dof_ide (:)
3737  real(kind=kreal),pointer :: val_ptr(:)
3738  integer(kind=kint) :: i, j, n, old_size, new_size
3739 
3740  n = fstr_ctrl_get_data_line_n( ctrl )
3741  if( n == 0 ) return
3742  old_size = p%SOLID%VELOCITY_ngrp_tot
3743  new_size = old_size + n
3744  p%SOLID%VELOCITY_ngrp_tot = new_size
3745 
3746  call fstr_expand_integer_array (p%SOLID%VELOCITY_ngrp_ID , old_size, new_size )
3747  call fstr_expand_integer_array (p%SOLID%VELOCITY_ngrp_type, old_size, new_size )
3748  call fstr_expand_real_array (p%SOLID%VELOCITY_ngrp_val , old_size, new_size )
3749  call fstr_expand_integer_array (p%SOLID%VELOCITY_ngrp_amp , old_size, new_size )
3750 
3751  allocate( grp_id_name(n))
3752  allocate( dof_ids(n))
3753  allocate( dof_ide(n))
3754 
3755  amp = ''
3756  val_ptr => p%SOLID%VELOCITY_ngrp_val(old_size+1:)
3757  val_ptr = 0
3758  rcode = fstr_ctrl_get_velocity( ctrl, vtype, amp, &
3759  grp_id_name, hecmw_name_len, &
3760  dof_ids, dof_ide, val_ptr )
3761  if( rcode /= 0 ) call fstr_ctrl_err_stop
3762  p%SOLID%VELOCITY_type = vtype
3763  if( vtype == kbcinitial ) p%DYN%VarInitialize = .true.
3764  call amp_name_to_id( p%MESH, '!VELOCITY', amp, amp_id )
3765  call node_grp_name_to_id_ex( p%MESH, '!VELOCITY', &
3766  n, grp_id_name, p%SOLID%VELOCITY_ngrp_ID(old_size+1:))
3767 
3768  j = old_size+1
3769  do i = 1, n
3770  if( (dof_ids(i) < 1).or.(6 < dof_ids(i)).or.(dof_ide(i) < 1).or.(6 < dof_ide(i)) ) then
3771  write(ilog,*) 'fstr control file error : !VELOCITY : range of dof_ids and dof_ide is from 1 to 6'
3772  stop
3773  end if
3774  p%SOLID%VELOCITY_ngrp_type(j) = 10 * dof_ids(i) + dof_ide(i)
3775  p%SOLID%VELOCITY_ngrp_amp(j) = amp_id
3776  j = j+1
3777  end do
3778 
3779  deallocate( grp_id_name )
3780  deallocate( dof_ids )
3781  deallocate( dof_ide )
3782 
3783  end subroutine fstr_setup_velocity
3784 
3785 
3786  !-----------------------------------------------------------------------------!
3788  !-----------------------------------------------------------------------------!
3789 
3790  subroutine fstr_setup_acceleration( ctrl, counter, P )
3791  implicit none
3792  integer(kind=kint) :: ctrl
3793  integer(kind=kint) :: counter
3794  type(fstr_param_pack) :: P
3795 
3796  integer(kind=kint) :: rcode
3797  integer(kind=kint) :: aType
3798  character(HECMW_NAME_LEN) :: amp
3799  integer(kind=kint) :: amp_id
3800  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
3801  integer(kind=kint),pointer :: dof_ids (:)
3802  integer(kind=kint),pointer :: dof_ide (:)
3803  real(kind=kreal),pointer :: val_ptr(:)
3804  integer(kind=kint) :: i, j, n, old_size, new_size
3805 
3806 
3807  n = fstr_ctrl_get_data_line_n( ctrl )
3808  if( n == 0 ) return
3809  old_size = p%SOLID%ACCELERATION_ngrp_tot
3810  new_size = old_size + n
3811  p%SOLID%ACCELERATION_ngrp_tot = new_size
3812 
3813  call fstr_expand_integer_array (p%SOLID%ACCELERATION_ngrp_ID , old_size, new_size )
3814  call fstr_expand_integer_array (p%SOLID%ACCELERATION_ngrp_type, old_size, new_size )
3815  call fstr_expand_real_array (p%SOLID%ACCELERATION_ngrp_val , old_size, new_size )
3816  call fstr_expand_integer_array (p%SOLID%ACCELERATION_ngrp_amp , old_size, new_size )
3817 
3818  allocate( grp_id_name(n))
3819  allocate( dof_ids(n))
3820  allocate( dof_ide(n))
3821 
3822  amp = ' '
3823  val_ptr => p%SOLID%ACCELERATION_ngrp_val(old_size+1:)
3824  val_ptr = 0
3825  rcode = fstr_ctrl_get_acceleration( ctrl, atype, amp, &
3826  grp_id_name, hecmw_name_len, &
3827  dof_ids, dof_ide, val_ptr)
3828  if( rcode /= 0 ) call fstr_ctrl_err_stop
3829  p%SOLID%ACCELERATION_type = atype
3830  if( atype == kbcinitial )p%DYN%VarInitialize = .true.
3831  call amp_name_to_id( p%MESH, '!ACCELERATION', amp, amp_id )
3832  call node_grp_name_to_id_ex( p%MESH, '!ACCELERATION', &
3833  n, grp_id_name, p%SOLID%ACCELERATION_ngrp_ID(old_size+1:))
3834 
3835  j = old_size+1
3836  do i = 1, n
3837  if( (dof_ids(i) < 1).or.(6 < dof_ids(i)).or.(dof_ide(i) < 1).or.(6 < dof_ide(i)) ) then
3838  write(ilog,*) 'fstr control file error : !ACCELERATION : range of dof_ids and dof_ide is from 1 to 6'
3839  stop
3840  end if
3841  p%SOLID%ACCELERATION_ngrp_type(j) = 10 * dof_ids(i) + dof_ide(i)
3842  p%SOLID%ACCELERATION_ngrp_amp(j) = amp_id
3843  j = j+1
3844  end do
3845 
3846  deallocate( grp_id_name )
3847  deallocate( dof_ids )
3848  deallocate( dof_ide )
3849  end subroutine fstr_setup_acceleration
3850 
3851 
3852  !*****************************************************************************!
3853  !* MPC ***********************************************************************!
3854  !*****************************************************************************!
3855 
3856  !-----------------------------------------------------------------------------!
3858  !-----------------------------------------------------------------------------!
3859 
3860  subroutine fstr_setup_mpc( ctrl, counter, P )
3861  implicit none
3862  integer(kind=kint) :: ctrl
3863  integer(kind=kint) :: counter
3864  type(fstr_param_pack), target :: P
3865 
3866  integer(kind=kint) :: rcode
3867  ! integer(kind=kint) :: type
3868  ! integer(kind=kint),pointer :: node1_ptr(:)
3869  ! integer(kind=kint),pointer :: node2_ptr(:)
3870  ! integer(kind=kint),pointer :: dof_ptr(:)
3871  ! integer(kind=kint) :: n, old_size, new_size
3872  !
3873  ! rcode = fstr_ctrl_get_param_ex( ctrl, 'TYPE ', 'RIGID ', 1, 'P', type )
3874  ! if( rcode < 0 ) call fstr_ctrl_err_stop
3875  !
3876  ! n = fstr_ctrl_get_data_line_n( ctrl )
3877  ! if( n == 0 ) return
3878  ! old_size = P%MPC_RD%nmpc
3879  ! new_size = old_size + n
3880  ! P%MPC_RD%nmpc = new_size
3881  !
3882  ! call fstr_expand_integer_array ( P%MPC_RD%node1, old_size, new_size )
3883  ! call fstr_expand_integer_array ( P%MPC_RD%node2, old_size, new_size )
3884  ! call fstr_expand_integer_array ( P%MPC_RD%dof, old_size, new_size )
3885  !
3886  ! node1_ptr => P%MPC_RD%node1(old_size+1:)
3887  ! node2_ptr => P%MPC_RD%node2(old_size+1:)
3888  ! dof_ptr => P%MPC_RD%dof(old_size+1:)
3889  !
3890  ! rcode = fstr_ctrl_get_MPC( ctrl, type, node1_ptr, node2_ptr, dof_ptr )
3891  ! if( rcode /= 0 ) call fstr_ctrl_err_stop
3892  !
3893  ! if( node_global_to_local( P%MESH, node1_ptr, n ) /= n ) then
3894  ! call fstr_setup_util_err_stop( '### Error : not exist node (!MPC)' )
3895  ! endif
3896  ! if( node_global_to_local( P%MESH, node2_ptr, n ) /= n ) then
3897  ! call fstr_setup_util_err_stop( '### Error : not exist node (!MPC)' )
3898  ! endif
3899 
3900  ! penalty => svRarray(11)
3901  rcode = fstr_ctrl_get_mpc( ctrl, svrarray(11))
3902  if( rcode /= 0) call fstr_ctrl_err_stop
3903  end subroutine fstr_setup_mpc
3904 
3905 
3906  !*****************************************************************************!
3907  !* IMPORTING NASTRAN BOUNDARY CONDITIONS *************************************!
3908  !*****************************************************************************!
3909 
3910  subroutine fstr_setup_solid_nastran( ctrl, hecMESH, fstrSOLID )
3911  implicit none
3912  integer(kind=kint) :: ctrl
3913  type (hecmwST_local_mesh) :: hecMESH
3914  type (fstr_solid ) :: fstrSOLID
3915  write(ilog,*) '### Error : In !BOUNDARY, TYPE=NASTRAN is not supported.'
3916  call hecmw_abort( hecmw_comm_get_comm())
3917  end subroutine fstr_setup_solid_nastran
3918 
3919  !-----------------------------------------------------------------------------!
3921  !-----------------------------------------------------------------------------!
3922 
3923  subroutine fstr_setup_contactalgo( ctrl, P )
3924  implicit none
3925  integer(kind=kint) :: ctrl
3926  ! integer(kind=kint) :: counter
3927  type(fstr_param_pack) :: P
3928 
3929  integer(kind=kint) :: rcode
3930 
3931 
3932  rcode = fstr_ctrl_get_contactalgo( ctrl, p%PARAM%contact_algo )
3933  if( rcode /= 0 ) call fstr_ctrl_err_stop
3934 
3935  end subroutine fstr_setup_contactalgo
3936 
3937  !-----------------------------------------------------------------------------!
3939  !-----------------------------------------------------------------------------!
3940 
3941  subroutine fstr_setup_output_sstype( ctrl, P )
3942  implicit none
3943  integer(kind=kint) :: ctrl
3944  type(fstr_param_pack) :: P
3945 
3946  integer(kind=kint) :: rcode, nid
3947  character(len=HECMW_NAME_LEN) :: data_fmt
3948 
3949  data_fmt = 'SOLUTION,MATERIAL '
3950  rcode = fstr_ctrl_get_param_ex( ctrl, 'TYPE ', data_fmt, 0, 'P', nid )
3951  opsstype = nid
3952  if( rcode /= 0 ) call fstr_ctrl_err_stop
3953 
3954  end subroutine fstr_setup_output_sstype
3955 
3956  !-----------------------------------------------------------------------------!
3958  !-----------------------------------------------------------------------------!
3959 
3960  subroutine fstr_convert_contact_type( hecMESH )
3961  implicit none
3962  type(hecmwst_local_mesh), pointer :: hecMESH
3963  integer(kind=kint) :: n, i, sgrp_id, ngrp_id, ngrp_id2
3964  ! convert SURF_SURF to NODE_SURF
3965  n = hecmesh%contact_pair%n_pair
3966  do i = 1,n
3967  if( hecmesh%contact_pair%type(i) /= hecmw_contact_type_surf_surf ) cycle
3968  sgrp_id = hecmesh%contact_pair%slave_grp_id(i)
3969  call append_node_grp_from_surf_grp( hecmesh, sgrp_id, ngrp_id )
3970  ! change type of contact and slave group ID
3971  hecmesh%contact_pair%type(i) = hecmw_contact_type_node_surf
3972  hecmesh%contact_pair%slave_grp_id(i) = ngrp_id
3973  ! ! for DEBUG
3974  ! sgrp_id = hecMESH%contact_pair%master_grp_id(i)
3975  ! call append_node_grp_from_surf_grp( hecMESH, sgrp_id, ngrp_id2 )
3976  ! ! intersection node group of slave and master
3977  ! call append_intersection_node_grp( hecMESH, ngrp_id, ngrp_id2 )
3978  ! ! intersection node_group of original slave and patch-slave
3979  ! ngrp_id=get_grp_id( hecMESH, 'node_grp', 'SLAVE' )
3980  ! ngrp_id2=get_grp_id( hecMESH, 'node_grp', '_PT_SLAVE_S' )
3981  ! call append_intersection_node_grp( hecMESH, ngrp_id, ngrp_id2 )
3982  enddo
3983  end subroutine fstr_convert_contact_type
3984 
3985 end module m_fstr_setup
int fstr_ctrl_get_param_ex(int *ctrl, const char *param_name, const char *value_list, int *necessity, char *type, void *val)
int fstr_ctrl_get_data_array_ex(int *ctrl, const char *format,...)
int fstr_ctrl_open(char *filename)
int fstr_ctrl_get_c_h_name(int *ctrl, char *header_name, int *buff_size)
int fstr_ctrl_get_data_ex(int *ctrl, int *line_no, const char *format,...)
integer(kind=kint) function fstr_ctrl_get_fload(ctrl, node_id, node_id_len, dof_id, value)
This module encapsulate the basic functions of all elements provide by this software.
Definition: element.f90:43
integer function numofquadpoints(fetype)
Obtains the number of quadrature points of the element.
Definition: element.f90:450
integer(kind=kind(2)) function getspacedimension(etype)
Obtain the space dimension of the element.
Definition: element.f90:117
This module contains fstr control file data obtaining functions.
integer(kind=kint) function fstr_ctrl_get_contactalgo(ctrl, algo)
Read in !CONTACT.
integer(kind=kint) function fstr_ctrl_get_contactparam(ctrl, contactparam)
Read in !CONTACT_PARAM !
integer(kind=kint) function fstr_ctrl_get_solution(ctrl, type, nlgeom)
Read in !SOLUTION.
integer(kind=kint) function fstr_ctrl_get_contact_if(ctrl, n, contact_if)
Read in contact interference.
integer(kind=kint) function fstr_ctrl_get_couple(ctrl, fg_type, fg_first, fg_window, surf_id, surf_id_len)
Read in !COUPLE.
integer(kind=kint) function fstr_get_autoinc(ctrl, aincparam)
Read in !AUTOINC_PARAM !
integer(kind=kint) function fstr_ctrl_get_amplitude(ctrl, nline, name, type_def, type_time, type_val, n, val, table)
Read in !AMPLITUDE.
logical function fstr_ctrl_get_outitem(ctrl, hecMESH, outinfo)
Read in !OUTPUT_RES & !OUTPUT_VIS.
integer(kind=kint) function fstr_ctrl_get_elemopt(ctrl, elemopt361)
Read in !ELEMOPT.
integer(kind=kint) function fstr_ctrl_get_timepoints(ctrl, tp)
Read in !TIME_POINTS.
integer(kind=kint) function fstr_ctrl_get_solver(ctrl, method, precond, nset, iterlog, timelog, steplog, nier, iterpremax, nrest, nBFGS, scaling, dumptype, dumpexit, usejad, ncolor_in, mpc_method, estcond, method2, recyclepre, solver_opt, contact_elim, resid, singma_diag, sigma, thresh, filter)
Read in !SOLVER.
integer(kind=kint) function fstr_ctrl_get_echo(ctrl, echo)
Read in !ECHO.
integer(kind=kint) function fstr_ctrl_get_nonlinear_solver(ctrl, method)
Read in !NONLINEAR_SOLVER.
integer(kind=kint) function fstr_ctrl_get_mpc(ctrl, penalty)
Read in !MPC.
integer function fstr_ctrl_get_section(ctrl, hecMESH, sections)
Read in !SECTION.
logical function fstr_ctrl_get_contact(ctrl, n, contact, np, tp, ntol, ttol, ctAlgo, cpname)
Read in contact definition.
logical function fstr_ctrl_get_istep(ctrl, hecMESH, steps, tpname, apname)
Read in !STEP and !ISTEP.
integer(kind=kint) function fstr_ctrl_get_write(ctrl, res, visual, femap)
Read in !WRITE.
integer(kind=kint) function fstr_ctrl_get_step(ctrl, amp, iproc)
Read in !STEP.
integer(kind=kint) function fstr_ctrl_get_element_activation(ctrl, amp, eps, grp_id_name, dtype, state, thlow, thup)
Read in !ELEMENT_ACTIVATION.
logical function fstr_ctrl_get_embed(ctrl, n, embed, cpname)
Read in contact definition.
This module contains control file data obtaining functions for dynamic analysis.
integer(kind=kint) function fstr_ctrl_get_dynamic(ctrl, nlgeom, idx_eqa, idx_resp, n_step, t_start, t_end, t_delta, gamma, beta, idx_mas, idx_dmp, ray_m, ray_k, nout, node_id, node_id_len, nout_monit, iout_list)
Read in !DYNAMIC.
integer(kind=kint) function fstr_ctrl_get_velocity(ctrl, vType, amp, node_id, node_id_len, dof_ids, dof_ide, value)
Read in !VELOCITY.
integer(kind=kint) function fstr_ctrl_get_acceleration(ctrl, aType, amp, node_id, node_id_len, dof_ids, dof_ide, value)
Read in !ACCELERATION.
This module contains control file data obtaining functions for dynamic analysis.
integer(kind=kint) function fstr_ctrl_get_eigen(ctrl, nget, tolerance, maxiter)
Read in !EIGEN (struct)
This module contains control file data obtaining functions for heat conductive analysis.
integer(kind=kint) function fstr_ctrl_get_dflux(ctrl, amp, elem_grp_name, elem_grp_name_len, load_type, value)
Read in !DFLUX (heat)
integer(kind=kint) function fstr_ctrl_get_sflux(ctrl, amp, surface_grp_name, surface_grp_name_len, value)
Read in !SFLUX (heat)
integer(kind=kint) function fstr_ctrl_get_weldline(ctrl, hecMESH, grp_name_len, weldline)
Read in !WELD_LINE (heat)
integer(kind=kint) function fstr_ctrl_get_heat(ctrl, dt, etime, dtmin, deltmx, itmax, eps, tpname, beta)
Read in !HEAT.
integer(kind=kint) function fstr_ctrl_get_film(ctrl, amp1, amp2, elem_grp_name, elem_grp_name_len, load_type, value, sink)
Read in !FILM (heat)
integer(kind=kint) function fstr_ctrl_get_radiate(ctrl, amp1, amp2, elem_grp_name, elem_grp_name_len, load_type, value, sink)
Read in !RADIATE (heat)
integer(kind=kint) function fstr_ctrl_get_cflux(ctrl, amp, node_grp_name, node_grp_name_len, value)
Read in !CFLUX (heat)
integer(kind=kint) function fstr_ctrl_get_fixtemp(ctrl, amp, node_grp_name, node_grp_name_len, value)
Read in !FIXTEMP.
integer(kind=kint) function fstr_ctrl_get_sfilm(ctrl, amp1, amp2, surface_grp_name, surface_grp_name_len, value, sink)
Read in !SFILM (heat)
integer(kind=kint) function fstr_ctrl_get_sradiate(ctrl, amp1, amp2, surface_grp_name, surface_grp_name_len, value, sink)
Read in !SRADIATE (heat)
This module manages read in of various material properties.
integer function fstr_ctrl_get_dashpot_d(ctrl, mattype, nlgeom, matval_i, dict)
Read in !DASHPOT_D.
integer function fstr_ctrl_get_hyperelastic(ctrl, mattype, nlgeom, matval)
Read in !HYPERELASTIC.
integer function fstr_ctrl_get_viscoelasticity(ctrl, mattype, nlgeom, dict)
Read in !VISCOELASTIC.
integer function fstr_ctrl_get_viscoplasticity(ctrl, mattype, nlgeom, dict)
Read in !CREEP.
integer function fstr_ctrl_get_usermaterial(ctrl, mattype, nlgeom, nstatus, matval)
Read in !USER_MATERIAL.
integer function fstr_ctrl_get_expansion_coeff(ctrl, matval, dict)
Read in !EXPANSION_COEFF.
integer function fstr_ctrl_get_trs(ctrl, mattype, matval)
Read in !TRS.
integer function fstr_ctrl_get_elasticity(ctrl, mattype, nlgeom, matval, dict)
Read in !ELASTIC.
integer function fstr_ctrl_get_plasticity(ctrl, mattype, nlgeom, matval, mattable, dict)
Read in !PLASTIC.
integer function fstr_ctrl_get_dashpot_a(ctrl, mattype, nlgeom, matval_i, dict)
Read in !DASHPOT_A.
integer function fstr_ctrl_get_material(ctrl, matname)
Read in !MATERIAL.
integer function fstr_ctrl_get_density(ctrl, matval)
Read in !DENSITY.
integer function fstr_ctrl_get_spring_a(ctrl, mattype, nlgeom, matval_i, dict)
Read in !SPRING_A.
integer function fstr_ctrl_get_fluid(ctrl, mattype, nlgeom, matval, dict)
Read in !FLUID.
integer function fstr_ctrl_get_spring_d(ctrl, mattype, nlgeom, matval_i, dict)
Read in !SPRING_D.
This module contains control file data obtaining functions for static analysis.
integer(kind=kint) function fstr_ctrl_get_spring(ctrl, amp, node_id, node_id_len, dof_id, value)
Read in !SPRING.
integer(kind=kint) function fstr_ctrl_get_static(ctrl, dtime, etime, itime, eps, restart_nout, idx_elpl, iout_list, sig_y0, h_dash, nout, nout_monit, node_monit_1, elem_monit_1, intg_monit_1)
Read in !STATIC.
integer(kind=kint) function fstr_ctrl_get_boundary(ctrl, amp, node_id, node_id_len, dof_ids, dof_ide, value)
Read in !BOUNDARY.
integer(kind=kint) function fstr_ctrl_get_reftemp(ctrl, value)
Read in !REFTEMP.
integer(kind=kint) function fstr_ctrl_get_dload(ctrl, amp, follow, element_id, element_id_len, load_type, params)
Read in !DLOAD.
integer(kind=kint) function fstr_ctrl_get_temperature(ctrl, irres, tstep, tintl, rtype, node_id, node_id_len, value)
Read in !TEMPERATURE.
integer(kind=kint) function fstr_ctrl_get_cload(ctrl, amp, node_id, node_id_len, dof_id, value)
Read in !CLOAD.
integer function fstr_ctrl_get_userload(ctrl)
Read in !ULOAD.
This module contains auxiliary functions in calculation setup.
integer(kind=kint) function get_grp_member_n(hecMESH, grp_type_name, name)
subroutine fstr_ctrl_err_stop
subroutine node_grp_name_to_id_ex(hecMESH, header_name, n, grp_id_name, grp_ID)
subroutine surf_grp_name_to_id_ex(hecMESH, header_name, n, grp_id_name, grp_ID)
subroutine dload_grp_name_to_id_ex(hecMESH, n, grp_id_name, fg_surface, grp_ID)
subroutine fstr_setup_visualize(ctrl, hecMESH)
subroutine nodesurf_grp_name_to_id_ex(hecMESH, header_name, n, grp_id_name, grp_ID, grp_TYPE)
integer(kind=kint) function get_local_member_index(hecMESH, type_name, name, local_id)
subroutine fstr_expand_real_array2(array, column, old_size, new_size)
integer(kind=kint) function get_grp_member(hecMESH, grp_type_name, name, member1, member2)
subroutine fstr_expand_integer_array(array, old_size, new_size)
subroutine fstr_expand_real_array(array, old_size, new_size)
subroutine amp_name_to_id(hecMESH, header_name, aname, id)
subroutine append_new_amplitude(amp, name, type_def, type_time, type_val, np, val, table)
Append new amplitude table at the end of existing amplitude tables.
subroutine append_node_grp_from_surf_grp(hecMESH, sgrp_id, ngrp_id)
integer(kind=kint) function node_global_to_local(hecMESH, list, n)
subroutine elem_grp_name_to_id_ex(hecMESH, header_name, n, grp_id_name, grp_ID)
subroutine fstr_strupr(s)
subroutine reallocate_real(array, n)
subroutine reallocate_integer(array, n)
integer(kind=kint) function get_sorted_local_member_index(hecMESH, hecPARAM, type_name, name, local_id)
subroutine fstr_expand_integer_array2(array, column, old_size, new_size)
logical function fstr_streqr(s1, s2)
This module provides functions to read in data from control file and do necessary preparation for fol...
Definition: fstr_setup.f90:7
subroutine fstr_setup_boundary(ctrl, counter, P)
Read in !BOUNDARY !
subroutine fstr_setup_eigenread(ctrl, counter, P)
Read in !EIGENREAD !
subroutine fstr_setup_static(ctrl, counter, P)
Read in !STATIC(old) !
subroutine fstr_setup_mpc(ctrl, counter, P)
Read in !MPC !
integer(kind=kint) function fstr_setup_initial(ctrl, cond, hecMESH)
subroutine fstr_setup_sradiate(ctrl, counter, P)
Read in !SRADIATE !
subroutine fstr_setup_radiate(ctrl, counter, P)
Read in !RADIATE !
subroutine fstr_setup_element_activation(ctrl, counter, P)
Read in !ELEMENT_ACTIVATION.
subroutine fstr_setup_fload(ctrl, counter, P)
Read in !FLOAD !
subroutine fstr_setup_contactalgo(ctrl, P)
Read in !CONTACT !
subroutine fstr_setup_dload(ctrl, counter, P)
Read in !DLOAD.
subroutine fstr_eigen_init(fstrEIG)
Initial setting of eigen ca;culation.
subroutine fstr_setup_dflux(ctrl, counter, P)
Read in !DFLUX !
subroutine fstr_setup_post_phys_alloc(phys, NDOF, n_node, n_elem)
Initial setting of postprecessor.
subroutine fstr_solid_finalize(fstrSOLID)
Finalizer of fstr_solid.
subroutine fstr_setup_cflux(ctrl, counter, P)
Read in !CFLUX !
subroutine fstr_smoothed_element_calcmaxcon(hecMESH, fstrSOLID)
subroutine fstr_smoothed_element_init(hecMESH, fstrSOLID)
subroutine fstr_setup_amplitude(ctrl, P)
Read in !AMPLITUDE !
subroutine fstr_convert_contact_type(hecMESH)
Convert SURF-SURF contact to NODE-SURF contact !
subroutine fstr_setup_couple(ctrl, counter, P)
Read in !COUPLE !
subroutine fstr_solid_init(hecMESH, fstrSOLID)
Initializer of structure fstr_solid.
subroutine fstr_setup_step(ctrl, counter, P)
Read in !STEP !
subroutine fstr_dynamic_init(fstrDYNAMIC)
Initial setting of dynamic calculation.
subroutine fstr_setup_solid_nastran(ctrl, hecMESH, fstrSOLID)
subroutine fstr_setup_solver(ctrl, counter, P)
Read in !SOLVER !
subroutine fstr_setup_restart(ctrl, nout, version)
Read in !RESTART !
subroutine fstr_setup_cload(ctrl, counter, P)
Read in !CLOAD !
subroutine fstr_heat_init(fstrHEAT)
Initial setting of heat analysis.
subroutine fstr_setup_output_sstype(ctrl, P)
Read in !OUTPUT_SSTYPE !
subroutine fstr_setup_write(ctrl, counter, P)
Read in !WRITE !
subroutine fstr_setup_eigen(ctrl, counter, P)
Read in !EIGEN !
subroutine fstr_setup_film(ctrl, counter, P)
Read in !FILM !
subroutine fstr_setup_solution(ctrl, counter, P)
Read in !SOLUTION !
subroutine fstr_setup_acceleration(ctrl, counter, P)
Read in !ACCELERATION !
subroutine fstr_setup_velocity(ctrl, counter, P)
Read in !VELOCITY !
subroutine fstr_setup_heat(ctrl, counter, P)
Read in !HEAT !
subroutine fstr_setup_temperature(ctrl, counter, P)
Read in !TEMPERATURE !
subroutine fstr_setup_dynamic(ctrl, counter, P)
Read in !DYNAMIC !
subroutine fstr_setup_nonlinear_solver(ctrl, counter, P)
Read in !NONLINEAR_SOLVER !
subroutine fstr_setup(cntl_filename, hecMESH, fstrPARAM, fstrSOLID, fstrEIG, fstrHEAT, fstrDYNAMIC, fstrCPL, fstrFREQ)
Read in and initialize control data !
Definition: fstr_setup.f90:44
integer function fstr_setup_orientation(ctrl, hecMESH, cnt, coordsys)
Read in !ORIENTATION.
subroutine fstr_setup_fixtemp(ctrl, counter, P)
Read in !FIXTEMP !
subroutine fstr_element_init(hecMESH, fstrSOLID, solution_type)
Initialize elements info in static calculation.
subroutine fstr_setup_reftemp(ctrl, counter, P)
Read in !REFTEMP !
subroutine fstr_setup_echo(ctrl, counter, P)
Read in !ECHO !
subroutine fstr_setup_post(ctrl, P)
subroutine fstr_expand_dload_array(array, old_size, new_size)
Reset !DLOAD !
subroutine fstr_setup_sfilm(ctrl, counter, P)
Read in !SFILM !
subroutine fstr_dynamic_alloc(hecMESH, fstrDYNAMIC)
Initial setting of dynamic calculation.
subroutine fstr_setup_spring(ctrl, counter, P)
Read in !SPRING !
subroutine fstr_dynamic_finalize(fstrDYNAMIC)
Finalizer of fstr_solid.
subroutine fstr_setup_sflux(ctrl, counter, P)
Read in !SFLUX !
subroutine fstr_solid_alloc(hecMESH, fstrSOLID)
Initializer of structure fstr_solid.
This module defines common data and basic structures for analysis.
Definition: m_fstr.f90:15
integer(kind=kint), parameter iutb
Definition: m_fstr.f90:110
real(kind=kreal) eps
Definition: m_fstr.f90:143
integer(kind=kint) myrank
PARALLEL EXECUTION.
Definition: m_fstr.f90:97
integer(kind=kint), parameter kel341sesns
Definition: m_fstr.f90:76
integer(kind=kint), parameter kbcffstr
boundary condition file type (bcf)
Definition: m_fstr.f90:64
real(kind=kreal), dimension(100) svrarray
Definition: m_fstr.f90:119
integer(kind=kint), parameter kstdynamic
Definition: m_fstr.f90:41
real(kind=kreal) etime
Definition: m_fstr.f90:141
integer(kind=kint), parameter kel341fi
section control
Definition: m_fstr.f90:75
integer(kind=kint), parameter idbg
Definition: m_fstr.f90:112
integer(kind=kint), parameter kel361fi
Definition: m_fstr.f90:78
integer(kind=kint) opsstype
Definition: m_fstr.f90:133
integer(kind=kint), dimension(100) sviarray
SOLVER CONTROL.
Definition: m_fstr.f90:118
integer(kind=kint), parameter kon
Definition: m_fstr.f90:33
integer(kind=kint), parameter kfloadcase_im
Definition: m_fstr.f90:87
integer(kind=kint) itmax
Definition: m_fstr.f90:142
integer(kind=kint), parameter kel361ic
Definition: m_fstr.f90:80
integer(kind=kint), parameter ilog
FILE HANDLER.
Definition: m_fstr.f90:108
real(kind=kreal) dt
ANALYSIS CONTROL for NLGEOM and HEAT.
Definition: m_fstr.f90:140
integer(kind=kint), parameter kststatic
Definition: m_fstr.f90:38
integer(kind=kint), parameter kbcinitial
Definition: m_fstr.f90:67
integer(kind=kint), parameter kcaalagrange
Definition: m_fstr.f90:61
integer(kind=kint), parameter kststaticeigen
Definition: m_fstr.f90:43
integer(kind=kint), parameter kstheat
Definition: m_fstr.f90:40
real(kind=kreal), pointer ref_temp
REFTEMP.
Definition: m_fstr.f90:137
integer(kind=kint), parameter kel361fbar
Definition: m_fstr.f90:81
integer(kind=kint), parameter ksteigen
Definition: m_fstr.f90:39
type(tinitialcondition), dimension(:), pointer, save g_initialcnd
Definition: m_fstr.f90:152
logical paracontactflag
PARALLEL CONTACT FLAG.
Definition: m_fstr.f90:101
integer(kind=kint), parameter kfloadcase_re
Definition: m_fstr.f90:86
This module manages step information.
Definition: m_out.f90:6
subroutine fstr_init_outctrl(outctrl)
Definition: m_out.f90:228
subroutine fstr_copy_outctrl(outctrl1, outctrl2)
Definition: m_out.f90:236
subroutine fstr_ctrl_get_output(ctrl, outctrl, islog, res, visual, femap)
Definition: m_out.f90:259
This module provides a function to fetch material properties from hecmw.
subroutine fstr_get_prop(hecMESH, shell_var, isect, ee, pp, rho, alpha, thick, n_totlyr, alpha_over_mu, beam_radius, beam_angle1, beam_angle2, beam_angle3, beam_angle4, beam_angle5, beam_angle6)
This module contains several strategy to free locking problem in Eight-node hexagonal element.
integer(kind=kint) function, public return_nn_comp_c3d4_sesns(nn, nodlocal)
This module manages step information.
Definition: m_step.f90:6
subroutine free_stepinfo(step)
Finalizer.
Definition: m_step.f90:137
subroutine init_stepinfo(stepinfo)
Initializer.
Definition: m_step.f90:68
subroutine init_aincparam(aincparam)
Initializer.
Definition: m_step.f90:182
subroutine setup_stepinfo_starttime(stepinfos)
Definition: m_step.f90:89
This module provides aux functions.
Definition: utilities.f90:6
subroutine cross_product(v1, v2, vn)
Definition: utilities.f90:367
This module provides functions to calculate contact stiff matrix.
Definition: fstr_contact.f90:6
real(kind=kreal), save cdotp
mu=cdotp*maxval
real(kind=kreal), save mut
penalty along tangent direction
real(kind=kreal), save cgt
convergent condition of relative tangent disp
real(kind=kreal), save cgn
convergent condition of penetration
This module manage the parameters for contact calculation.
subroutine, public init_contactparam(cparam)
subroutine, public init_contact_if(contact_if)
This module summarizes all information of material properties.
Definition: material.f90:6
integer(kind=kint), parameter m_youngs
Definition: material.f90:92
integer(kind=kint), parameter m_beam_radius
Definition: material.f90:109
integer(kind=kint), parameter viscoelastic
Definition: material.f90:77
integer(kind=kint), parameter m_exapnsion
Definition: material.f90:105
integer(kind=kint), parameter m_beam_angle6
Definition: material.f90:115
integer(kind=kint), parameter elastic
Definition: material.f90:65
integer(kind=kint), parameter m_beam_angle3
Definition: material.f90:112
integer(kind=kint), parameter m_density
Definition: material.f90:94
integer(kind=kint), parameter m_beam_angle4
Definition: material.f90:113
integer(kind=kint), parameter m_poisson
Definition: material.f90:93
integer(kind=kint), parameter m_beam_angle1
Definition: material.f90:110
integer(kind=kint), parameter m_thick
Definition: material.f90:95
integer(kind=kint), parameter m_beam_angle5
Definition: material.f90:114
integer(kind=kint), parameter m_beam_angle2
Definition: material.f90:111
integer(kind=kint), parameter m_alpha_over_mu
Definition: material.f90:107
subroutine initmaterial(material)
Initializer.
Definition: material.f90:188
This modules defines a structure to record history dependent parameter in static analysis.
Definition: mechgauss.f90:6
subroutine fstr_init_gauss(gauss)
Initializer.
Definition: mechgauss.f90:46
Data for coupling analysis.
Definition: m_fstr.f90:619
Data for DYNAMIC ANSLYSIS (fstrDYNAMIC)
Definition: m_fstr.f90:512
Package of data used by Lanczos eigenvalue solver.
Definition: m_fstr.f90:601
Data for HEAT ANSLYSIS (fstrHEAT)
Definition: m_fstr.f90:430
FSTR INNER CONTROL PARAMETERS (fstrPARAM)
Definition: m_fstr.f90:155
Data for STATIC ANSLYSIS (fstrSOLID)
Definition: m_fstr.f90:213
Package of all data needs to initialize.
Definition: fstr_setup.f90:26
output control such as output filename, output frequency etc.
Definition: m_out.f90:29