FrontISTR  5.9.0
Large-scale structural analysis program with finit element method
fstr_ctrl_common.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 !-------------------------------------------------------------------------------
6 
8  use m_fstr
9  use hecmw
10  use mcontact
11  use m_timepoint
13 
14  implicit none
15 
16  private :: pc_strupr
17 
18 contains
19 
20  subroutine pc_strupr( s )
21  implicit none
22  character(*) :: s
23  integer :: i, n, a, da
24 
25  n = len_trim(s)
26  da = iachar('a') - iachar('A')
27  do i = 1, n
28  a = iachar(s(i:i))
29  if( a > iachar('Z')) then
30  a = a - da
31  s(i:i) = achar(a)
32  end if
33  end do
34  end subroutine pc_strupr
35 
36 
38  function fstr_ctrl_get_solution( ctrl, type, nlgeom )
39  integer(kind=kint) :: ctrl
40  integer(kind=kint) :: type
41  logical :: nlgeom
42  integer(kind=kint) :: fstr_ctrl_get_solution
43 
44  integer(kind=kint) :: ipt
45  character(len=80) :: s
46 
48 
49  s = 'ELEMCHECK,STATIC,EIGEN,HEAT,DYNAMIC,NLSTATIC,STATICEIGEN,NZPROF '
50  if( fstr_ctrl_get_param_ex( ctrl, 'TYPE ', s, 1, 'P', type )/= 0) return
51  type = type -1
52 
53  ipt=0
54  if( fstr_ctrl_get_param_ex( ctrl, 'NONLINEAR ', '# ', 0, 'E', ipt )/= 0) return
55  if( ipt/=0 .and. ( type == kststatic .or. type == kstdynamic )) nlgeom = .true.
56 
57  if( type == 5 ) then !if type == NLSTATIC
58  type = kststatic
59  nlgeom = .true.
60  end if
61  if( type == kststaticeigen ) nlgeom = .true.
62 
64  end function fstr_ctrl_get_solution
65 
67  function fstr_ctrl_get_nonlinear_solver( ctrl, method )
68  integer(kind=kint) :: ctrl
69  integer(kind=kint) :: method
70  integer(kind=kint) :: fstr_ctrl_get_nonlinear_solver
71 
72  integer(kind=kint) :: ipt
73  character(len=80) :: s
74 
76 
77  s = 'NEWTON,QUASINEWTON '
78  if( fstr_ctrl_get_param_ex( ctrl, 'METHOD ', s, 1, 'P', method )/= 0) return
81 
83  function fstr_ctrl_get_solver( ctrl, method, precond, nset, iterlog, timelog, steplog, nier, &
84  iterpremax, nrest, nBFGS, scaling, &
85  dumptype, dumpexit, usejad, ncolor_in, mpc_method, estcond, method2, recyclepre, &
86  solver_opt, contact_elim, &
87  resid, singma_diag, sigma, thresh, filter, solver_ropt, loglevel )
88  integer(kind=kint) :: ctrl
89  integer(kind=kint) :: method
90  integer(kind=kint) :: precond
91  integer(kind=kint) :: nset
92  integer(kind=kint) :: iterlog
93  integer(kind=kint) :: timelog
94  integer(kind=kint) :: steplog
95  integer(kind=kint) :: nier
96  integer(kind=kint) :: iterpremax
97  integer(kind=kint) :: nrest
98  integer(kind=kint) :: nbfgs
99  integer(kind=kint) :: scaling
100  integer(kind=kint) :: dumptype
101  integer(kind=kint) :: dumpexit
102  integer(kind=kint) :: usejad
103  integer(kind=kint) :: ncolor_in
104  integer(kind=kint) :: mpc_method
105  integer(kind=kint) :: estcond
106  integer(kind=kint) :: method2
107  integer(kind=kint) :: recyclepre
108  integer(kind=kint) :: solver_opt(10)
109  integer(kind=kint) :: contact_elim
110  real(kind=kreal) :: resid
111  real(kind=kreal) :: singma_diag
112  real(kind=kreal) :: sigma
113  real(kind=kreal) :: thresh
114  real(kind=kreal) :: filter
115  real(kind=kreal) :: solver_ropt(10)
116  integer(kind=kint) :: loglevel
117  integer(kind=kint) :: fstr_ctrl_get_solver
118 
119  character(100) :: mlist = '1,2,3,4,101,CG,BiCGSTAB,GMRES,GPBiCG,GMRESR,GMRESREN,CR,DIRECT,DIRECTmkl,DIRECTlag,MUMPS,MKL '
120  !character(92) :: mlist = '1,2,3,4,5,101,CG,BiCGSTAB,GMRES,GPBiCG,DIRECT,DIRECTmkl,DIRECTlag,MUMPS,MKL '
121  character(24) :: dlist = '0,1,2,3,NONE,MM,CSR,BSR '
122 
123  integer(kind=kint) :: number_number = 5
124  integer(kind=kint) :: indirect_number = 7 ! GMRESR, GMRESREN and CR need to be added
125  integer(kind=kint) :: iter, time, sclg, dmpt, dmpx, usjd, step
126 
128 
129  iter = iterlog+1
130  time = timelog+1
131  step = steplog+1
132  sclg = scaling+1
133  dmpt = dumptype+1
134  dmpx = dumpexit+1
135  usjd = usejad+1
136  !* parameter in header line -----------------------------------------------------------------*!
137 
138  ! JP-0
139  if( fstr_ctrl_get_param_ex( ctrl, 'METHOD ', mlist, 1, 'P', method ) /= 0) return
140  if( fstr_ctrl_get_param_ex( ctrl, 'PRECOND ', '1,2,3,4,5,6,7,8,9,10,11,12,20,21,22,30,31,32 ' ,0, 'I', precond ) /= 0) return
141  if( fstr_ctrl_get_param_ex( ctrl, 'NSET ', '0,-1,+1 ', 0, 'I', nset ) /= 0) return
142  if( fstr_ctrl_get_param_ex( ctrl, 'ITERLOG ', 'NO,YES ', 0, 'P', iter ) /= 0) return
143  if( fstr_ctrl_get_param_ex( ctrl, 'TIMELOG ', 'NO,YES,VERBOSE ', 0, 'P', time ) /= 0) return
144  if( fstr_ctrl_get_param_ex( ctrl, 'STEPLOG ', 'NO,YES ', 0, 'P', step ) /= 0) return
145  if( fstr_ctrl_get_param_ex( ctrl, 'SCALING ', 'NO,YES ', 0, 'P', sclg ) /= 0) return
146  if( fstr_ctrl_get_param_ex( ctrl, 'DUMPTYPE ', dlist, 0, 'P', dmpt ) /= 0) return
147  if( fstr_ctrl_get_param_ex( ctrl, 'DUMPEXIT ','NO,YES ', 0, 'P', dmpx ) /= 0) return
148  if( fstr_ctrl_get_param_ex( ctrl, 'USEJAD ' ,'NO,YES ', 0, 'P', usjd ) /= 0) return
149  if( fstr_ctrl_get_param_ex( ctrl, 'MPCMETHOD ','# ', 0, 'I',mpc_method) /= 0) return
150  if( fstr_ctrl_get_param_ex( ctrl, 'ESTCOND ' ,'# ', 0, 'I',estcond ) /= 0) return
151  if( fstr_ctrl_get_param_ex( ctrl, 'METHOD2 ', mlist, 0, 'P', method2 ) /= 0) return
152  if( fstr_ctrl_get_param_ex( ctrl, 'CONTACT_ELIM ','# ', 0, 'I',contact_elim ) /= 0) return
153  ! diagnostic verbosity, independent of TIMELOG. -1 = "unset": each consumer
154  ! (ML / SA-AMG) then falls back to its previous default, so behavior is
155  ! unchanged unless LOGLEVEL is given explicitly.
156  loglevel = -1
157  if( fstr_ctrl_get_param_ex( ctrl, 'LOGLEVEL ','# ', 0, 'I',loglevel ) /= 0) return
158  ! JP-1
159  if( method > number_number ) then ! JP-2
160  method = method - number_number
161  if( method > indirect_number ) then
162  ! JP-3
163  method = method - indirect_number + 100
164  if( method == 103 ) method = 101 ! DIRECTlag => DIRECT
165  if( method == 105 ) method = 102 ! MKL => DIRECTmkl
166  end if
167  end if
168  if( method2 > number_number ) then ! JP-2
169  method2 = method2 - number_number
170  if( method2 > indirect_number ) then
171  ! JP-3
172  method2 = method2 - indirect_number + 100
173  end if
174  end if
175 
176  dumptype = dmpt - 1
177  if( dumptype >= 4 ) then
178  dumptype = dumptype - 4
179  end if
180 
181  !* data --------------------------------------------------------------------------------------- *!
182  ! JP-4
183  if( fstr_ctrl_get_data_ex( ctrl, 1, 'iiiiii ', nier, iterpremax, nrest, ncolor_in, recyclepre, nbfgs )/= 0) return
184  if( fstr_ctrl_get_data_ex( ctrl, 2, 'rrr ', resid, singma_diag, sigma )/= 0) return
185 
186  if( precond == 20 .or. precond == 21) then
187  if( fstr_ctrl_get_data_ex( ctrl, 3, 'rr ', thresh, filter)/= 0) return
188  else if( precond == 5 ) then
189  if( fstr_ctrl_get_data_ex( ctrl, 3, 'iiiiiiiiii ', &
190  solver_opt(1), solver_opt(2), solver_opt(3), solver_opt(4), solver_opt(5), &
191  solver_opt(6), solver_opt(7), solver_opt(8), solver_opt(9), solver_opt(10) )/= 0) return
192  else if( precond == 22 ) then
193  ! SA-AMG options. Two optional data lines; trailing entries may be omitted.
194  ! 0 = use the built-in default for each. Integer slots 1-7 mirror the ML
195  ! (PRECOND=5) layout so an ML option line carries over (hecmw_ML_wrapper.c
196  ! reads opt[0..6] = slots 1-7); slots 8-10 are SA-AMG-specific. ML does not
197  ! read the real line at all.
198  ! (verbose has no slot here: enable diagnostics via !SOLVER LOGLEVEL>=1.)
199  ! line 3 (integers):
200  ! 1 coarse_solver (0=auto/1=smoother/2=dense/3=mumps), 2 smoother (0/1=Chebyshev only),
201  ! 3 cycle (0=default(W)/1=V/2=W), 4 max_level,
202  ! 5 RESERVED (ML CoarsenScheme: ignored with a warning), 6 cheb_deg, 7 coarse_size,
203  ! 8 max_size, 9 galerkin_lowmem (0=default(2-stage,faster),
204  ! >0=low-memory (fuse finest level only)), 10 RESERVED
205  ! line 4 (reals): theta, cheb_alpha, safety,
206  ! taper_k (coarsening taper: 0=default(100), >0=use as K, <0=disable),
207  ! agg_order (aggregation seed ordering: 0=default(BFS), <0=natural/legacy,
208  ! 1..4=explicit mode),
209  ! min_size, verify (0=off/>0=on), dump_vtk (0=off/>0=on)
210  solver_opt(1:10) = 0
211  solver_ropt(1:10) = 0.0d0
212  if( fstr_ctrl_get_data_ex( ctrl, 3, 'iiiiiiiiii ', &
213  solver_opt(1), solver_opt(2), solver_opt(3), solver_opt(4), solver_opt(5), &
214  solver_opt(6), solver_opt(7), solver_opt(8), solver_opt(9), solver_opt(10) )/= 0) solver_opt(1:10) = 0
215  if( fstr_ctrl_get_data_ex( ctrl, 4, 'rrrrrrrr ', &
216  solver_ropt(1), solver_ropt(2), solver_ropt(3), solver_ropt(4), solver_ropt(5), &
217  solver_ropt(6), solver_ropt(7), solver_ropt(8) )/= 0) solver_ropt(1:10) = 0.0d0
218  else if( method == 101 ) then
219  if( fstr_ctrl_get_data_ex( ctrl, 3, 'i ', solver_opt(1) )/= 0) return
220  end if
221 
222  iterlog = iter -1
223  timelog = time -1
224  steplog = step -1
225  scaling = sclg -1
226  dumpexit = dmpx -1
227  usejad = usjd -1
228 
230 
231  end function fstr_ctrl_get_solver
232 
233 
235  function fstr_ctrl_get_step( ctrl, amp, iproc )
236  integer(kind=kint) :: ctrl
237  character(len=HECMW_NAME_LEN) :: amp
238  integer(kind=kint) :: iproc
239  integer(kind=kint) :: fstr_ctrl_get_step
240 
241  integer(kind=kint) :: ipt = 0
242  integer(kind=kint) :: ip = 0
243 
244  fstr_ctrl_get_step = -1
245 
246  if( fstr_ctrl_get_param_ex( ctrl, 'AMP ', '# ', 0, 'S', amp )/= 0) return
247  if( fstr_ctrl_get_param_ex( ctrl, 'TYPE ', 'STANDARD,NLGEOM ', 0, 'P', ipt )/= 0) return
248  if( fstr_ctrl_get_param_ex( ctrl, 'NLGEOM ', '# ', 0, 'E', ip )/= 0) return
249 
250  if( ipt == 2 .or. ip == 1 ) iproc = 1
251 
253 
254  end function fstr_ctrl_get_step
255 
257  logical function fstr_ctrl_get_istep( ctrl, hecMESH, steps, tpname, apname )
258  use fstr_setup_util
259  use m_step
260  integer(kind=kint), intent(in) :: ctrl
261  type (hecmwst_local_mesh), intent(in) :: hecmesh
262  type(step_info), intent(inout) :: steps
263  character(len=*), intent(out) :: tpname
264  character(len=*), intent(out) :: apname
265 
266  character(len=HECMW_NAME_LEN) :: data_fmt,ss, data_fmt1
267  character(len=HECMW_NAME_LEN) :: amp
268  character(len=HECMW_NAME_LEN) :: header_name
269  integer(kind=kint) :: bcid
270  integer(kind=kint) :: i, n, sn, ierr
271  integer(kind=kint) :: bc_n, load_n, contact_n, elemact_n
272  real(kind=kreal) :: fn, f1, f2, f3
273 
274  fstr_ctrl_get_istep = .false.
275 
276  write(ss,*) hecmw_name_len
277  write( data_fmt, '(a,a,a)') 'S', trim(adjustl(ss)), 'I '
278  write( data_fmt1, '(a,a,a)') 'S', trim(adjustl(ss)),'rrr '
279 
280  steps%solution = stepstatic
281  if( fstr_ctrl_get_param_ex( ctrl, 'TYPE ', 'STATIC,VISCO ', 0, 'P', steps%solution )/= 0) return
282  steps%inc_type = stepfixedinc
283  if( fstr_ctrl_get_param_ex( ctrl, 'INC_TYPE ', 'FIXED,AUTO ', 0, 'P', steps%inc_type )/= 0) return
284  if( fstr_ctrl_get_param_ex( ctrl, 'SUBSTEPS ', '# ', 0, 'I', steps%num_substep )/= 0) return
285  steps%initdt = 1.d0/steps%num_substep
286  if( fstr_ctrl_get_param_ex( ctrl, 'ITMAX ', '# ', 0, 'I', steps%max_iter )/= 0) return
287  if( fstr_ctrl_get_param_ex( ctrl, 'MAXITER ', '# ', 0, 'I', steps%max_iter )/= 0) return
288  if( fstr_ctrl_get_param_ex( ctrl, 'MAXCONTITER ', '# ', 0, 'I', steps%max_contiter )/= 0) return
289  if( fstr_ctrl_get_param_ex( ctrl, 'CONVERG ', '# ', 0, 'R', steps%converg )/= 0) return
290  if( fstr_ctrl_get_param_ex( ctrl, 'CONVERG_LAG ', '# ', 0, 'R', steps%converg_lag )/= 0) return
291  if( fstr_ctrl_get_param_ex( ctrl, 'CONVERG_DDISP ', '# ', 0, 'R', steps%converg_ddisp )/= 0) return
292  if( fstr_ctrl_get_param_ex( ctrl, 'MAXRES ', '# ', 0, 'R', steps%maxres )/= 0) return
293  amp = ""
294  if( fstr_ctrl_get_param_ex( ctrl, 'AMP ', '# ', 0, 'S', amp )/= 0) return
295  if( len( trim(amp) )>0 ) then
296  call amp_name_to_id( hecmesh, '!STEP', amp, steps%amp_id )
297  endif
298  ! AMPLITUDE = RAMP | STEP : default sub-step application of prescribed displacements.
299  ! Default preserves current behavior (static=RAMP, visco=STEP).
300  steps%amp_default_type = stepampramp
301  if( steps%solution == stepvisco ) steps%amp_default_type = stepampstep
302  if( fstr_ctrl_get_param_ex( ctrl, 'AMPLITUDE ', 'RAMP,STEP ', 0, 'P', steps%amp_default_type )/= 0) return
303  tpname=""
304  if( fstr_ctrl_get_param_ex( ctrl, 'TIMEPOINTS ', '# ', 0, 'S', tpname )/= 0) return
305  apname=""
306  if( fstr_ctrl_get_param_ex( ctrl, 'AUTOINCPARAM ', '# ', 0, 'S', apname )/= 0) return
307 
308  n = fstr_ctrl_get_data_line_n( ctrl )
309  if( n == 0 ) then
310  fstr_ctrl_get_istep = .true.; return
311  endif
312 
313  f2 = steps%mindt
314  f3 = steps%maxdt
315  if( fstr_ctrl_get_data_ex( ctrl, 1, data_fmt1, ss, f1, f2, f3 )/= 0) return
316  read( ss, * , iostat=ierr ) fn
317  sn=1
318  if( ierr==0 ) then
319  steps%initdt = fn
320  steps%elapsetime = f1
321  if( steps%inc_type == stepautoinc ) then
322  steps%mindt = min(f2,steps%initdt)
323  steps%maxdt = f3
324  endif
325  steps%num_substep = max(int((f1+0.999999999d0*fn)/fn),steps%num_substep)
326  !if( mod(f1,fn)/=0 ) steps%num_substep =steps%num_substep+1
327  sn = 2
328  endif
329 
330  bc_n = 0
331  load_n = 0
332  contact_n = 0
333  elemact_n = 0
334  do i=sn,n
335  if( fstr_ctrl_get_data_ex( ctrl, i, data_fmt, header_name, bcid )/= 0) return
336  if( trim(header_name) == 'BOUNDARY' ) then
337  bc_n = bc_n + 1
338  else if( trim(header_name) == 'LOAD' ) then
339  load_n = load_n +1
340  else if( trim(header_name) == 'CONTACT' ) then
341  contact_n = contact_n+1
342  else if( trim(header_name) == 'ELEMACT' ) then
343  elemact_n = elemact_n+1
344  else if( trim(header_name) == 'TEMPERATURE' ) then
345  ! steps%Temperature = .true.
346  endif
347  end do
348 
349  if( bc_n>0 ) allocate( steps%Boundary(bc_n) )
350  if( load_n>0 ) allocate( steps%Load(load_n) )
351  if( contact_n>0 ) allocate( steps%Contact(contact_n) )
352  if( elemact_n>0 ) allocate( steps%ElemActivation(elemact_n) )
353 
354  bc_n = 0
355  load_n = 0
356  contact_n = 0
357  elemact_n = 0
358  do i=sn,n
359  if( fstr_ctrl_get_data_ex( ctrl, i, data_fmt, header_name, bcid )/= 0) return
360  if( trim(header_name) == 'BOUNDARY' ) then
361  bc_n = bc_n + 1
362  steps%Boundary(bc_n) = bcid
363  else if( trim(header_name) == 'LOAD' ) then
364  load_n = load_n +1
365  steps%Load(load_n) = bcid
366  else if( trim(header_name) == 'CONTACT' ) then
367  contact_n = contact_n+1
368  steps%Contact(contact_n) = bcid
369  else if( trim(header_name) == 'ELEMACT' ) then
370  elemact_n = elemact_n+1
371  steps%ElemActivation(elemact_n) = bcid
372  endif
373  end do
374 
375  fstr_ctrl_get_istep = .true.
376  end function fstr_ctrl_get_istep
377 
379  integer function fstr_ctrl_get_section( ctrl, hecMESH, sections )
380  use fstr_setup_util
381  integer(kind=kint), intent(in) :: ctrl
382  type (hecmwst_local_mesh), intent(inout) :: hecmesh
383  type (tsection), pointer, intent(inout) :: sections(:)
384 
385  integer(kind=kint) :: j, k, sect_id, ori_id, elemopt
386  integer(kind=kint),save :: cache = 1
387  character(len=HECMW_NAME_LEN) :: sect_orien
388  character(19) :: form341list = 'FI,SELECTIVE_ESNS '
389  character(19) :: form361list = 'FI,BBAR,IC,FBAR,UP '
390 
392 
393  if( fstr_ctrl_get_param_ex( ctrl, 'SECNUM ', '# ', 1, 'I', sect_id )/= 0) return
394  if( sect_id > hecmesh%section%n_sect ) return
395 
396  elemopt = 0
397  if( fstr_ctrl_get_param_ex( ctrl, 'FORM341 ', form341list, 0, 'P', elemopt )/= 0) return
398  if( elemopt > 0 ) sections(sect_id)%elemopt341 = elemopt
399 
400  elemopt = 0
401  if( fstr_ctrl_get_param_ex( ctrl, 'FORM361 ', form361list, 0, 'P', elemopt )/= 0) return
402  if( elemopt > 0 ) sections(sect_id)%elemopt361 = elemopt
403 
404  ! sectional orientation ID
405  hecmesh%section%sect_orien_ID(sect_id) = -1
406  if( fstr_ctrl_get_param_ex( ctrl, 'ORIENTATION ', '# ', 0, 'S', sect_orien )/= 0) return
407 
408  if( associated(g_localcoordsys) ) then
409  call fstr_strupr(sect_orien)
410  k = size(g_localcoordsys)
411 
412  if(cache < k)then
413  if( sect_orien == g_localcoordsys(cache)%sys_name ) then
414  hecmesh%section%sect_orien_ID(sect_id) = cache
415  cache = cache + 1
417  return
418  endif
419  endif
420 
421  do j=1, k
422  if( sect_orien == g_localcoordsys(j)%sys_name ) then
423  hecmesh%section%sect_orien_ID(sect_id) = j
424  cache = j + 1
425  exit
426  endif
427  enddo
428  endif
429 
431 
432  end function fstr_ctrl_get_section
433 
434 
436  function fstr_ctrl_get_write( ctrl, res, visual, femap )
437  integer(kind=kint) :: ctrl
438  integer(kind=kint) :: res
439  integer(kind=kint) :: visual
440  integer(kind=kint) :: femap
441  integer(kind=kint) :: fstr_ctrl_get_write
442 
444 
445  ! JP-6
446  if( fstr_ctrl_get_param_ex( ctrl, 'RESULT ', '# ', 0, 'E', res )/= 0) return
447  if( fstr_ctrl_get_param_ex( ctrl, 'VISUAL ', '# ', 0, 'E', visual )/= 0) return
448  if( fstr_ctrl_get_param_ex( ctrl, 'FEMAP ', '# ', 0, 'E', femap )/= 0) return
449 
451 
452  end function fstr_ctrl_get_write
453 
455  function fstr_ctrl_get_echo( ctrl, echo )
456  integer(kind=kint) :: ctrl
457  integer(kind=kint) :: echo
458  integer(kind=kint) :: fstr_ctrl_get_echo
459 
460  echo = kon;
461 
463 
464  end function fstr_ctrl_get_echo
465 
467  function fstr_ctrl_get_couple( ctrl, fg_type, fg_first, fg_window, surf_id, surf_id_len )
468  integer(kind=kint) :: ctrl
469  integer(kind=kint) :: fg_type
470  integer(kind=kint) :: fg_first
471  integer(kind=kint) :: fg_window
472  character(len=HECMW_NAME_LEN) :: surf_id(:)
473  integer(kind=kint) :: surf_id_len
474  integer(kind=kint) :: fstr_ctrl_get_couple
475 
476  character(len=HECMW_NAME_LEN) :: data_fmt,ss
477  write(ss,*) surf_id_len
478  write(data_fmt,'(a,a,a)') 'S',trim(adjustl(ss)),' '
479 
481  if( fstr_ctrl_get_param_ex( ctrl, 'TYPE ', '1,2,3,4,5,6 ', 0, 'I', fg_type )/= 0) return
482  if( fstr_ctrl_get_param_ex( ctrl, 'ISTEP ', '# ', 0, 'I', fg_first )/= 0) return
483  if( fstr_ctrl_get_param_ex( ctrl, 'WINDOW ', '# ', 0, 'I', fg_window )/= 0) return
484 
486  fstr_ctrl_get_data_array_ex( ctrl, data_fmt, surf_id )
487 
488  end function fstr_ctrl_get_couple
489 
491  function fstr_ctrl_get_mpc( ctrl, penalty )
492  integer(kind=kint), intent(in) :: ctrl
493  real(kind=kreal), intent(out) :: penalty
494  integer(kind=kint) :: fstr_ctrl_get_mpc
495 
496  fstr_ctrl_get_mpc = fstr_ctrl_get_data_ex( ctrl, 1, 'r ', penalty )
497  if( penalty <= 1.0 ) then
498  if (myrank == 0) then
499  write(imsg,*) "Warging : !MPC : too small penalty: ", penalty
500  write(*,*) "Warging : !MPC : too small penalty: ", penalty
501  endif
502  endif
503 
504  end function fstr_ctrl_get_mpc
505 
507  logical function fstr_ctrl_get_outitem( ctrl, hecMESH, outinfo )
508  use fstr_setup_util
509  use m_out
510  integer(kind=kint), intent(in) :: ctrl
511  type (hecmwst_local_mesh), intent(in) :: hecmesh
512  type( output_info ), intent(out) :: outinfo
513 
514  integer(kind=kint) :: rcode, ipos
515  integer(kind=kint) :: n, i, j
516  character(len=HECMW_NAME_LEN) :: data_fmt, ss
517  character(len=HECMW_NAME_LEN), allocatable :: header_name(:), onoff(:), vtype(:)
518 
519  write( ss, * ) hecmw_name_len
520  write( data_fmt, '(a,a,a,a,a)') 'S', trim(adjustl(ss)), 'S', trim(adjustl(ss)), ' '
521  ! write( data_fmt, '(a,a,a,a,a,a,a)') 'S', trim(adjustl(ss)), 'S', trim(adjustl(ss)), 'S', trim(adjustl(ss)), ' '
522 
523  fstr_ctrl_get_outitem = .false.
524 
525  outinfo%grp_id_name = "ALL"
526  rcode = fstr_ctrl_get_param_ex( ctrl, 'GROUP ', '# ', 0, 'S', outinfo%grp_id_name )
527  ipos = 0
528  rcode = fstr_ctrl_get_param_ex( ctrl, 'ACTION ', 'SUM ', 0, 'P', ipos )
529  outinfo%actn = ipos
530 
531  n = fstr_ctrl_get_data_line_n( ctrl )
532  if( n == 0 ) return
533  allocate( header_name(n), onoff(n), vtype(n) )
534  header_name(:) = ""; vtype(:) = ""; onoff(:) = ""
535  rcode = fstr_ctrl_get_data_array_ex( ctrl, data_fmt, header_name, onoff )
536  ! rcode = fstr_ctrl_get_data_array_ex( ctrl, data_fmt, header_name, onoff, vtype )
537 
538  do i = 1, n
539  do j = 1, outinfo%num_items
540  if( trim(header_name(i)) == outinfo%keyWord(j) ) then
541  outinfo%on(j) = .true.
542  if( trim(onoff(i)) == 'OFF' ) outinfo%on(j) = .false.
543  if( len( trim(vtype(i)) )>0 ) then
544  if( fstr_str2index( vtype(i), ipos ) ) then
545  outinfo%vtype(j) = ipos
546  else if( trim(vtype(i)) == "SCALER" ) then
547  outinfo%vtype(j) = -1
548  else if( trim(vtype(i)) == "VECTOR" ) then
549  outinfo%vtype(j) = -2
550  else if( trim(vtype(i)) == "SYMTENSOR" ) then
551  outinfo%vtype(j) = -3
552  else if( trim(vtype(i)) == "TENSOR" ) then
553  outinfo%vtype(j) = -4
554  endif
555  endif
556  endif
557  enddo
558  enddo
559 
560  deallocate( header_name, onoff, vtype )
561  fstr_ctrl_get_outitem = .true.
562 
563  end function fstr_ctrl_get_outitem
564 
566  function fstr_ctrl_get_contactalgo( ctrl, algo, augiter )
567  integer(kind=kint) :: ctrl
568  integer(kind=kint) :: algo
569  integer(kind=kint) :: augiter
570  integer(kind=kint) :: fstr_ctrl_get_contactalgo
571 
572  integer(kind=kint) :: rcode
573  character(len=80) :: s
574  s = 'SLAGRANGE,ALAGRANGE '
575  rcode = fstr_ctrl_get_param_ex( ctrl, 'TYPE ', s, 0, 'P', algo )
576  if( rcode /= 0 ) then
578  return
579  endif
580  rcode = fstr_ctrl_get_param_ex( ctrl, 'AUGITER ', '# ', 0, 'I', augiter )
582  end function fstr_ctrl_get_contactalgo
583 
585  logical function fstr_ctrl_get_contact( ctrl, n, contact, np, tp, ntol, ttol, ctAlgo, cpname, smoothing )
586  use fstr_setup_util
587  integer(kind=kint), intent(in) :: ctrl
588  integer(kind=kint), intent(in) :: n
589  integer(kind=kint), intent(in) :: ctalgo
590  type(tcontact), intent(out) :: contact(n)
591  real(kind=kreal), intent(out) :: np
592  real(kind=kreal), intent(out) :: tp
593  real(kind=kreal), intent(out) :: ntol
594  real(kind=kreal), intent(out) :: ttol
595  character(len=*), intent(out) :: cpname
596  integer(kind=kint), intent(out) :: smoothing
597 
598  integer :: rcode, ipt
599  character(len=30) :: s1 = 'TIED,GLUED,SSLID,FSLID '
600  character(len=HECMW_NAME_LEN) :: data_fmt,ss
601  character(len=HECMW_NAME_LEN) :: cp_name(n)
602  real(kind=kreal) :: fcoeff(n),tpenalty(n)
603  real(kind=kreal) :: damp_alpha, damp_gact
604 
605  write(ss,*) hecmw_name_len
606 
607  fstr_ctrl_get_contact = .false.
608  contact(1)%ctype = 1 ! pure slave-master contact; default value
609  contact(1)%algtype = contactsslid ! small sliding contact; default value
610  rcode = fstr_ctrl_get_param_ex( ctrl, 'INTERACTION ', s1, 0, 'P', contact(1)%algtype )
611  if( contact(1)%algtype==contactglued ) contact(1)%algtype=contactfslid ! not complemented yet
612  if( fstr_ctrl_get_param_ex( ctrl, 'GRPID ', '# ', 1, 'I', contact(1)%group )/=0) return
613  smoothing = kcsnone + 1
614  if( fstr_ctrl_get_param_ex( ctrl, 'SMOOTHING ', 'NONE,NAGATA ', 0, 'P', smoothing ) /= 0 ) return
615  smoothing = smoothing - 1
616  do rcode=2,n
617  contact(rcode)%ctype = contact(1)%ctype
618  contact(rcode)%group = contact(1)%group
619  contact(rcode)%algtype = contact(1)%algtype
620  end do
621 
622  tpenalty = 0.5d0
623 
624  if( contact(1)%algtype==contactsslid .or. contact(1)%algtype==contactfslid ) then
625  write( data_fmt, '(a,a,a)') 'S', trim(adjustl(ss)),'Rr '
626  if( fstr_ctrl_get_data_array_ex( ctrl, data_fmt, cp_name, fcoeff, tpenalty ) /= 0 ) return
627  do rcode=1,n
628  call fstr_strupr(cp_name(rcode))
629  contact(rcode)%pair_name = cp_name(rcode)
630  contact(rcode)%fcoeff = fcoeff(rcode)
631  contact(rcode)%nPenalty = 5.0d0
632  contact(rcode)%tPenalty = tpenalty(rcode)
633  contact(rcode)%refStiff = 1.d0
634  contact(rcode)%damp_alpha = 0.0d0
635  contact(rcode)%damp_gact = 0.0d0
636  enddo
637  else if( contact(1)%algtype==contacttied ) then
638  write( data_fmt, '(a,a)') 'S', trim(adjustl(ss))
639  if( fstr_ctrl_get_data_array_ex( ctrl, data_fmt, cp_name ) /= 0 ) return
640  do rcode=1,n
641  call fstr_strupr(cp_name(rcode))
642  contact(rcode)%pair_name = cp_name(rcode)
643  contact(rcode)%nPenalty = 5.0d0
644  contact(rcode)%fcoeff = 0.d0
645  contact(rcode)%tPenalty = 1.d0
646  contact(rcode)%damp_alpha = 0.0d0
647  contact(rcode)%damp_gact = 0.0d0
648  enddo
649  endif
650 
651  np = 0.d0; tp=0.d0
652  ntol = 0.d0; ttol=0.d0
653  damp_alpha = 0.0d0; damp_gact = 0.0d0
654  if( fstr_ctrl_get_param_ex( ctrl, 'NPENALTY ', '# ', 0, 'R', np ) /= 0 ) return
655  if( fstr_ctrl_get_param_ex( ctrl, 'TPENALTY ', '# ', 0, 'R', tp ) /= 0 ) return
656  if( fstr_ctrl_get_param_ex( ctrl, 'NTOL ', '# ', 0, 'R', ntol ) /= 0 ) return
657  if( fstr_ctrl_get_param_ex( ctrl, 'TTOL ', '# ', 0, 'R', ttol ) /= 0 ) return
658  if( fstr_ctrl_get_param_ex( ctrl, 'DAMP_ALPHA ', '# ', 0, 'R', damp_alpha ) /= 0 ) return
659  if( fstr_ctrl_get_param_ex( ctrl, 'DAMP_GACT ', '# ', 0, 'R', damp_gact ) /= 0 ) return
660  cpname=""
661  if( fstr_ctrl_get_param_ex( ctrl, 'CONTACTPARAM ', '# ', 0, 'S', cpname )/= 0) return
662 
663  ! Set penalty coefficients to contact structure if specified (for ALagrange method)
664  if( np > 0.d0 ) then
665  do rcode=1,n
666  contact(rcode)%nPenalty = np
667  enddo
668  endif
669  if( tp > 0.d0 ) then
670  do rcode=1,n
671  contact(rcode)%tPenalty = tp
672  enddo
673  endif
674  if( damp_alpha > 0.0d0 ) then
675  do rcode=1,n
676  contact(rcode)%damp_alpha = damp_alpha
677  enddo
678  endif
679  if( damp_gact > 0.0d0 ) then
680  do rcode=1,n
681  contact(rcode)%damp_gact = damp_gact
682  enddo
683  endif
684 
685  fstr_ctrl_get_contact = .true.
686  end function fstr_ctrl_get_contact
687 
689  logical function fstr_ctrl_get_embed( ctrl, n, embed, cpname, smoothing )
690  use fstr_setup_util
691  integer(kind=kint), intent(in) :: ctrl
692  integer(kind=kint), intent(in) :: n
693  type(tcontact), intent(out) :: embed(n)
694  character(len=*), intent(out) :: cpname
695  integer(kind=kint), intent(out) :: smoothing
696 
697  integer :: rcode, ipt
698  character(len=30) :: s1 = 'TIED,GLUED,SSLID,FSLID '
699  character(len=HECMW_NAME_LEN) :: data_fmt,ss
700  character(len=HECMW_NAME_LEN) :: cp_name(n)
701  real(kind=kreal) :: fcoeff(n),tpenalty(n)
702 
703  tpenalty = 1.0d6
704 
705  write(ss,*) hecmw_name_len
706 
707  fstr_ctrl_get_embed = .false.
708  embed(1)%ctype = 1 ! pure slave-master contact; default value
709  embed(1)%algtype = contacttied ! small sliding contact; default value
710  if( fstr_ctrl_get_param_ex( ctrl, 'GRPID ', '# ', 1, 'I', embed(1)%group )/=0) return
711  smoothing = kcsnone + 1
712  if( fstr_ctrl_get_param_ex( ctrl, 'SMOOTHING ', 'NONE,NAGATA ', 0, 'P', smoothing ) /= 0 ) return
713  smoothing = smoothing - 1
714  do rcode=2,n
715  embed(rcode)%ctype = embed(1)%ctype
716  embed(rcode)%group = embed(1)%group
717  embed(rcode)%algtype = embed(1)%algtype
718  end do
719 
720  write( data_fmt, '(a,a)') 'S', trim(adjustl(ss))
721  if( fstr_ctrl_get_data_array_ex( ctrl, data_fmt, cp_name ) /= 0 ) return
722  do rcode=1,n
723  call fstr_strupr(cp_name(rcode))
724  embed(rcode)%pair_name = cp_name(rcode)
725  enddo
726 
727  cpname=""
728  if( fstr_ctrl_get_param_ex( ctrl, 'CONTACTPARAM ', '# ', 0, 'S', cpname )/= 0) return
729  fstr_ctrl_get_embed = .true.
730  end function
731 
733  function fstr_ctrl_get_contactparam( ctrl, contactparam )
734  implicit none
735  integer(kind=kint) :: ctrl
736  type( tcontactparam ) :: contactparam
737  integer(kind=kint) :: fstr_ctrl_get_contactparam
738 
739  integer(kind=kint) :: rcode
740  character(len=HECMW_NAME_LEN) :: data_fmt
741  character(len=128) :: msg
742  real(kind=kreal) :: clearance, clr_same_elem, clr_difflpos, clr_cal_norm
743  real(kind=kreal) :: distclr_init, distclr_free, distclr_nocheck, tensile_force
744  real(kind=kreal) :: box_exp_rate
745 
747 
748  !parameters
749  contactparam%name = ''
750  if( fstr_ctrl_get_param_ex( ctrl, 'NAME ', '# ', 1, 'S', contactparam%name ) /=0 ) return
751 
752  !read first line
753  data_fmt = 'rrrr '
754  rcode = fstr_ctrl_get_data_ex( ctrl, 1, data_fmt, &
755  & clearance, clr_same_elem, clr_difflpos, clr_cal_norm )
756  if( rcode /= 0 ) return
757  contactparam%CLEARANCE = clearance
758  contactparam%CLR_SAME_ELEM = clr_same_elem
759  contactparam%CLR_DIFFLPOS = clr_difflpos
760  contactparam%CLR_CAL_NORM = clr_cal_norm
761 
762  !read second line
763  data_fmt = 'rrrrr '
764  rcode = fstr_ctrl_get_data_ex( ctrl, 2, data_fmt, &
765  & distclr_init, distclr_free, distclr_nocheck, tensile_force, box_exp_rate )
766  if( rcode /= 0 ) return
767  contactparam%DISTCLR_INIT = distclr_init
768  contactparam%DISTCLR_FREE = distclr_free
769  contactparam%DISTCLR_NOCHECK = distclr_nocheck
770  contactparam%TENSILE_FORCE = tensile_force
771  contactparam%BOX_EXP_RATE = box_exp_rate
772 
773  !input check
774  rcode = 1
775  if( clearance<0.d0 .OR. 1.d0<clearance ) THEN
776  write(msg,*) 'fstr control file error : !CONTACT_PARAM : CLEARANCE must be 0 < CLEARANCE < 1.'
777  else if( clr_same_elem<0.d0 .or. 1.d0<clr_same_elem ) then
778  write(msg,*) 'fstr control file error : !CONTACT_PARAM : CLR_SAME_ELEM must be 0 < CLR_SAME_ELEM < 1.'
779  else if( clr_difflpos<0.d0 .or. 1.d0<clr_difflpos ) then
780  write(msg,*) 'fstr control file error : !CONTACT_PARAM : CLR_DIFFLPOS must be 0 < CLR_DIFFLPOS < 1.'
781  else if( clr_cal_norm<0.d0 .or. 1.d0<clr_cal_norm ) then
782  write(msg,*) 'fstr control file error : !CONTACT_PARAM : CLR_CAL_NORM must be 0 < CLR_CAL_NORM < 1.'
783  else if( distclr_init<0.d0 .or. 1.d0<distclr_init ) then
784  write(msg,*) 'fstr control file error : !CONTACT_PARAM : DISTCLR_INIT must be 0 < DISTCLR_INIT < 1.'
785  else if( distclr_free<-1.d0 .or. 1.d0<distclr_free ) then
786  write(msg,*) 'fstr control file error : !CONTACT_PARAM : DISTCLR_FREE must be -1 < DISTCLR_FREE < 1.'
787  else if( distclr_nocheck<0.5d0 ) then
788  write(msg,*) 'fstr control file error : !CONTACT_PARAM : DISTCLR_NOCHECK must be >= 0.5.'
789  else if( tensile_force>=0.d0 ) then
790  write(msg,*) 'fstr control file error : !CONTACT_PARAM : TENSILE_FORCE must be < 0.'
791  else if( box_exp_rate<=1.d0 .or. 2.0<box_exp_rate ) then
792  write(msg,*) 'fstr control file error : !CONTACT_PARAM : BOX_EXP_RATE must be 1 < BOX_EXP_RATE <= 2.'
793  else
794  rcode =0
795  end if
796  if( rcode /= 0 ) then
797  write(*,*) trim(msg)
798  write(ilog,*) trim(msg)
799  return
800  endif
801 
803  end function fstr_ctrl_get_contactparam
804 
806  function fstr_ctrl_get_contact_if( ctrl, n, contact_if )
807  use fstr_setup_util
808  integer(kind=kint), intent(in) :: ctrl
809  integer(kind=kint), intent(in) :: n
810  !
811  type(tcontactinterference), intent(out) :: contact_if(n)
812 
813  integer :: rcode, i
814  character(len=30) :: s1 = 'SLAVE,MASTER '
815  character(len=HECMW_NAME_LEN) :: data_fmt,ss
816  character(len=HECMW_NAME_LEN) :: cp_name(n)
817  real(kind=kreal) :: init_pos(n), end_pos(n)
818  integer(kind=kint) :: fstr_ctrl_get_contact_if
819 
821  write(ss,*) hecmw_name_len
822  if( fstr_ctrl_get_param_ex( ctrl, 'TYPE ', s1, 0, 'P', contact_if(1)%if_type ) /= 0 ) return
823  if( fstr_ctrl_get_param_ex( ctrl, 'END ', '# ', 0, 'R', contact_if(1)%etime ) /= 0 ) return
824  write( data_fmt, '(a,a,a)') 'S', trim(adjustl(ss)),'rr '
825  init_pos = 0.d0; end_pos = 0.d0
826  if( fstr_ctrl_get_data_array_ex( ctrl, data_fmt, cp_name, init_pos, end_pos ) /= 0 ) return
827  do i = 1, n
828  contact_if(i)%if_type = contact_if(1)%if_type
829  contact_if(i)%etime = contact_if(1)%etime
830 
831  contact_if(i)%cp_name = cp_name(i)
832  contact_if(i)%initial_pos = - init_pos(i)
833  contact_if(i)%end_pos = - end_pos(i)
834  if(contact_if(i)%if_type == c_if_slave .and. init_pos(i) /= 0.d0) contact_if(i)%initial_pos = 0.d0
835  end do
837 
838  end function fstr_ctrl_get_contact_if
839 
841  function fstr_ctrl_get_elemopt( ctrl, elemopt361 )
842  integer(kind=kint) :: ctrl
843  integer(kind=kint) :: elemopt361
844  integer(kind=kint) :: fstr_ctrl_get_elemopt
845 
846  character(72) :: o361list = 'IC,Bbar '
847 
848  integer(kind=kint) :: o361
849 
851 
852  o361 = elemopt361 + 1
853 
854  !* parameter in header line -----------------------------------------------------------------*!
855  if( fstr_ctrl_get_param_ex( ctrl, '361 ', o361list, 0, 'P', o361 ) /= 0) return
856 
857  elemopt361 = o361 - 1
858 
860 
861  end function fstr_ctrl_get_elemopt
862 
863 
865  function fstr_get_autoinc( ctrl, aincparam )
866  implicit none
867  integer(kind=kint) :: ctrl
868  type( tparamautoinc ) :: aincparam
869  integer(kind=kint) :: fstr_get_autoinc
870 
871  integer(kind=kint) :: rcode
872  character(len=HECMW_NAME_LEN) :: data_fmt
873  character(len=128) :: msg
874  integer(kind=kint) :: bound_s(10), bound_l(10)
875  real(kind=kreal) :: rs, rl
876 
877  fstr_get_autoinc = -1
878 
879  bound_s(:) = 0
880  bound_l(:) = 0
881 
882  !parameters
883  aincparam%name = ''
884  if( fstr_ctrl_get_param_ex( ctrl, 'NAME ', '# ', 1, 'S', aincparam%name ) /=0 ) return
885 
886  !read first line ( decrease criteria )
887  data_fmt = 'riiii '
888  rcode = fstr_ctrl_get_data_ex( ctrl, 1, data_fmt, rs, &
889  & bound_s(1), bound_s(2), bound_s(3), aincparam%NRtimes_s )
890  if( rcode /= 0 ) return
891  aincparam%ainc_Rs = rs
892  aincparam%NRbound_s(knstmaxit) = bound_s(1)
893  aincparam%NRbound_s(knstsumit) = bound_s(2)
894  aincparam%NRbound_s(knstciter) = bound_s(3)
895 
896  !read second line ( increase criteria )
897  data_fmt = 'riiii '
898  rcode = fstr_ctrl_get_data_ex( ctrl, 2, data_fmt, rl, &
899  & bound_l(1), bound_l(2), bound_l(3), aincparam%NRtimes_l )
900  if( rcode /= 0 ) return
901  aincparam%ainc_Rl = rl
902  aincparam%NRbound_l(knstmaxit) = bound_l(1)
903  aincparam%NRbound_l(knstsumit) = bound_l(2)
904  aincparam%NRbound_l(knstciter) = bound_l(3)
905 
906  !read third line ( cutback criteria )
907  data_fmt = 'ri '
908  rcode = fstr_ctrl_get_data_ex( ctrl, 3, data_fmt, &
909  & aincparam%ainc_Rc, aincparam%CBbound )
910  if( rcode /= 0 ) return
911 
912  !input check
913  rcode = 1
914  if( rs<0.d0 .or. rs>1.d0 ) then
915  write(msg,*) 'fstr control file error : !AUTOINC_PARAM : decrease ratio Rs must 0 < Rs < 1.'
916  else if( any(bound_s<0) ) then
917  write(msg,*) 'fstr control file error : !AUTOINC_PARAM : decrease NR bound must >= 0.'
918  else if( aincparam%NRtimes_s < 1 ) then
919  write(msg,*) 'fstr control file error : !AUTOINC_PARAM : # of times to decrease must > 0.'
920  else if( rl<1.d0 ) then
921  write(msg,*) 'fstr control file error : !AUTOINC_PARAM : increase ratio Rl must > 1.'
922  else if( any(bound_l<0) ) then
923  write(msg,*) 'fstr control file error : !AUTOINC_PARAM : increase NR bound must >= 0.'
924  else if( aincparam%NRtimes_l < 1 ) then
925  write(msg,*) 'fstr control file error : !AUTOINC_PARAM : # of times to increase must > 0.'
926  elseif( aincparam%ainc_Rc<0.d0 .or. aincparam%ainc_Rc>1.d0 ) then
927  write(msg,*) 'fstr control file error : !AUTOINC_PARAM : cutback decrease ratio Rc must 0 < Rc < 1.'
928  else if( aincparam%CBbound < 1 ) then
929  write(msg,*) 'fstr control file error : !AUTOINC_PARAM : maximum # of cutback times must > 0.'
930  else
931  rcode =0
932  end if
933  if( rcode /= 0 ) then
934  write(*,*) trim(msg)
935  write(ilog,*) trim(msg)
936  return
937  endif
938 
939  fstr_get_autoinc = 0
940  end function fstr_get_autoinc
941 
943  function fstr_ctrl_get_timepoints( ctrl, tp )
944  integer(kind=kint) :: ctrl
945  type(time_points) :: tp
946  integer(kind=kint) :: fstr_ctrl_get_timepoints
947 
948  integer(kind=kint) :: i, n, rcode
949  logical :: generate
950  real(kind=kreal) :: stime, etime, interval
951 
953 
954  tp%name = ''
955  if( fstr_ctrl_get_param_ex( ctrl, 'NAME ', '# ', 1, 'S', tp%name ) /=0 ) return
956  tp%range_type = 1
957  if( fstr_ctrl_get_param_ex( ctrl, 'TIME ', 'STEP,TOTAL ', 0, 'P', tp%range_type ) /= 0 ) return
958  generate = .false.
959  if( fstr_ctrl_get_param_ex( ctrl, 'GENERATE ', '# ', 0, 'E', generate ) /= 0) return
960 
961  if( generate ) then
962  stime = 0.d0; etime = 0.d0; interval = 1.d0
963  if( fstr_ctrl_get_data_ex( ctrl, 1, 'rrr ', stime, etime, interval ) /= 0) return
964  tp%n_points = int((etime-stime)/interval)+1
965  allocate(tp%points(tp%n_points))
966  do i=1,tp%n_points
967  tp%points(i) = stime + dble(i-1)*interval
968  end do
969  else
970  n = fstr_ctrl_get_data_line_n( ctrl )
971  if( n == 0 ) return
972  tp%n_points = n
973  allocate(tp%points(tp%n_points))
974  if( fstr_ctrl_get_data_array_ex( ctrl, 'r ', tp%points ) /= 0 ) return
975  do i=1,tp%n_points-1
976  if( tp%points(i) < tp%points(i+1) ) cycle
977  write(*,*) 'Error in reading !TIME_POINT: time points must be given in ascending order.'
978  return
979  end do
980  end if
981 
983  end function fstr_ctrl_get_timepoints
984 
986  function fstr_ctrl_get_amplitude( ctrl, nline, name, type_def, type_time, type_val, n, val, table )
987  implicit none
988  integer(kind=kint), intent(in) :: ctrl
989  integer(kind=kint), intent(in) :: nline
990  character(len=HECMW_NAME_LEN), intent(out) :: name
991  integer(kind=kint), intent(out) :: type_def
992  integer(kind=kint), intent(out) :: type_time
993  integer(kind=kint), intent(out) :: type_val
994  integer(kind=kint), intent(out) :: n
995  real(kind=kreal), pointer :: val(:)
996  real(kind=kreal), pointer :: table(:)
997  integer(kind=kint) :: fstr_ctrl_get_amplitude
998 
999  integer(kind=kint) :: t_def, t_time, t_val
1000  integer(kind=kint) :: i, j
1001  real(kind=kreal) :: r(4), t(4)
1002 
1004 
1005  name = ''
1006  t_def = 1
1007  t_time = 1
1008  t_val = 1
1009 
1010  if( fstr_ctrl_get_param_ex( ctrl, 'NAME ', '# ', 1, 'S', name )/=0 ) return
1011  if( fstr_ctrl_get_param_ex( ctrl, 'DEFINITION ', 'TABULAR ', 0, 'P', t_def )/=0 ) return
1012  if( fstr_ctrl_get_param_ex( ctrl, 'TIME ', 'STEP ', 0, 'P', t_time )/=0 ) return
1013  if( fstr_ctrl_get_param_ex( ctrl, 'VALUE ', 'RELATIVE,ABSOLUTE ', 0, 'P', t_val )/=0 ) return
1014 
1015  if( t_def==1 ) then
1016  type_def = hecmw_amp_typedef_tabular
1017  else
1018  write(*,*) 'Error in reading !AMPLITUDE: invalid value for parameter DEFINITION.'
1019  endif
1020  if( t_time==1 ) then
1021  type_time = hecmw_amp_typetime_step
1022  else
1023  write(*,*) 'Error in reading !AMPLITUDE: invalid value for parameter TIME.'
1024  endif
1025  if( t_val==1 ) then
1026  type_val = hecmw_amp_typeval_relative
1027  elseif( t_val==2 ) then
1028  type_val = hecmw_amp_typeval_absolute
1029  else
1030  write(*,*) 'Error in reading !AMPLITUDE: invalid value for parameter VALUE.'
1031  endif
1032 
1033  n = 0
1034  do i = 1, nline
1035  r(:)=huge(0.0d0); t(:)=huge(0.0d0)
1036  if( fstr_ctrl_get_data_ex( ctrl, 1, 'RRrrrrrr ', r(1), t(1), r(2), t(2), r(3), t(3), r(4), t(4) ) /= 0) return
1037  n = n+1
1038  val(n) = r(1)
1039  table(n) = t(1)
1040  do j = 2, 4
1041  if (r(j) < huge(0.0d0) .and. t(j) < huge(0.0d0)) then
1042  n = n+1
1043  val(n) = r(j)
1044  table(n) = t(j)
1045  else
1046  exit
1047  endif
1048  enddo
1049  enddo
1051 
1052  end function fstr_ctrl_get_amplitude
1053 
1055  function fstr_ctrl_get_element_activation( ctrl, amp, eps, grp_id_name, mode, measure, state, thlow, thup )
1056  implicit none
1057  integer(kind=kint) :: ctrl
1058  character(len=HECMW_NAME_LEN) :: amp
1059  real(kind=kreal) :: eps
1060  character(len=HECMW_NAME_LEN),target :: grp_id_name(:)
1061  integer(kind=kint) :: mode ! 1=FIXED, 2=AMPLITUDE, 3=DAMAGE
1062  integer(kind=kint) :: measure ! 1=NONE, 2=STRESS, 3=STRAIN
1063  integer(kind=kint) :: state ! 0=ACTIVE, 1=INACTIVE
1064  real(kind=kreal), target :: thlow(:), thup(:)
1065  integer(kind=kint) :: fstr_ctrl_get_element_activation
1066 
1067  character(len=HECMW_NAME_LEN),pointer :: element_id_p
1068  real(kind=kreal),pointer :: thlow_p(:), thup_p(:)
1069  integer(kind=kint) :: rcode, n
1070  character(len=HECMW_NAME_LEN) :: data_fmt, s1
1071 
1073 
1074  ! MODE (required)
1075  if( fstr_ctrl_get_param_ex( ctrl, 'MODE ', 'FIXED,AMPLITUDE,DAMAGE ', 1, 'P', mode ) /= 0 ) return
1076 
1077  ! Mode-specific parameters
1078  if( mode == 1 ) then
1079  ! FIXED: STATE required
1080  if( fstr_ctrl_get_param_ex( ctrl, 'STATE ', 'ON,OFF ', 1, 'P', state ) /= 0 ) return
1081  state = state - 1
1082  measure = 1
1083  amp = ''
1084  elseif( mode == 2 ) then
1085  ! AMPLITUDE: AMP required
1086  if( fstr_ctrl_get_param_ex( ctrl, 'AMP ', '# ', 1, 'S', amp ) /= 0 ) return
1087  state = 0
1088  measure = 1
1089  elseif( mode == 3 ) then
1090  ! DAMAGE: MEASURE required
1091  if( fstr_ctrl_get_param_ex( ctrl, 'MEASURE ', 'STRESS,STRAIN ', 1, 'P', measure ) /= 0 ) return
1092  measure = measure + 1
1093  state = 0
1094  amp = ''
1095  endif
1096 
1097  ! EPSILON (optional)
1098  eps = 1.0d-6
1099  if( fstr_ctrl_get_param_ex( ctrl, 'EPSILON ', '# ', 0, 'R', eps ) /= 0 ) return
1100 
1101  write(s1,*) hecmw_name_len
1102  n = fstr_ctrl_get_data_line_n(ctrl)
1103  element_id_p => grp_id_name(1)
1104  thlow_p => thlow
1105  thup_p => thup
1106 
1107  if( mode == 3 ) then
1108  write( data_fmt, '(a,a,a)') 'S', trim(adjustl(s1)), 'RR'
1109  rcode = fstr_ctrl_get_data_array_ex( ctrl, data_fmt, element_id_p, thlow_p, thup_p )
1110  else
1111  write( data_fmt, '(a,a)') 'S', trim(adjustl(s1))
1112  rcode = fstr_ctrl_get_data_array_ex( ctrl, data_fmt, element_id_p )
1113  endif
1114 
1116 
1118 
1119 
1120 end module fstr_ctrl_common
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_get_data_ex(int *ctrl, int *line_no, const char *format,...)
This module contains fstr control file data obtaining functions.
integer(kind=kint) function fstr_ctrl_get_element_activation(ctrl, amp, eps, grp_id_name, mode, measure, state, thlow, thup)
Read in !ELEMENT_ACTIVATION.
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_contactalgo(ctrl, algo, augiter)
Read in !CONTACT.
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_echo(ctrl, echo)
Read in !ECHO.
logical function fstr_ctrl_get_contact(ctrl, n, contact, np, tp, ntol, ttol, ctAlgo, cpname, smoothing)
Read in contact definition.
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, solver_ropt, loglevel)
Read in !SOLVER.
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_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.
logical function fstr_ctrl_get_embed(ctrl, n, embed, cpname, smoothing)
Read in contact definition.
This module contains auxiliary functions in calculation setup.
logical function fstr_str2index(s, x)
subroutine amp_name_to_id(hecMESH, header_name, aname, id)
subroutine fstr_strupr(s)
Definition: hecmw.f90:6
This module defines common data and basic structures for analysis.
Definition: m_fstr.F90:15
real(kind=kreal) eps
Definition: m_fstr.F90:145
integer(kind=kint) myrank
PARALLEL EXECUTION.
Definition: m_fstr.F90:99
integer(kind=kint), parameter imsg
Definition: m_fstr.F90:113
integer(kind=kint), parameter kstdynamic
Definition: m_fstr.F90:42
real(kind=kreal) etime
Definition: m_fstr.F90:143
integer(kind=kint), parameter kon
Definition: m_fstr.F90:34
integer(kind=kint), parameter ilog
FILE HANDLER.
Definition: m_fstr.F90:110
integer(kind=kint), parameter kststatic
Definition: m_fstr.F90:39
integer(kind=kint), parameter kststaticeigen
Definition: m_fstr.F90:44
This module manages step information.
Definition: m_out.f90:6
This module manages step information.
Definition: m_step.f90:6
integer, parameter stepampstep
Definition: m_step.f90:17
integer, parameter stepvisco
Definition: m_step.f90:13
integer, parameter stepfixedinc
Definition: m_step.f90:14
integer, parameter stepampramp
Definition: m_step.f90:16
integer, parameter stepautoinc
Definition: m_step.f90:15
integer, parameter stepstatic
Definition: m_step.f90:12
This module manages timepoint information.
Definition: m_timepoint.f90:6
Top-level contact analysis module (System level)
Data for section control.
Definition: m_fstr.F90:671
output information
Definition: m_out.f90:17
Step control such as active boundary condition, convergent condition etc.
Definition: m_step.f90:26
Time points storage for output etc.
Definition: m_timepoint.f90:14