FrontISTR  6.0.0
Large-scale structural analysis program with finit element method
fstr_heat_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 !-------------------------------------------------------------------------------
11  use m_fstr
12  use hecmw_setup_util, only &
13  : hecmw_streqr &
14  , get_grp_member &
20  use fstr_setup_util, only &
21  : fstr_param_pack &
22  , fstr_card_slot &
25  , reallocate_real &
26  , amp_name_to_id &
29  use fstr_ctrl_heat
31  implicit none
32 
33 contains
34 
36  subroutine fstr_heat_init( fstrHEAT )
37  implicit none
38  type(fstr_heat) :: fstrHEAT
39 
40  fstrheat%STEPtot = 0
41  fstrheat%MATERIALtot = 0
42  fstrheat%AMPLITUDEtot= 0
43  fstrheat%T_FIX_tot = 0
44  fstrheat%Q_NOD_tot = 0
45  fstrheat%Q_VOL_tot = 0
46  fstrheat%Q_SUF_tot = 0
47  fstrheat%R_SUF_tot = 0
48  fstrheat%H_SUF_tot = 0
49  fstrheat%WL_tot = 0
50  fstrheat%beta = -1.0d0
51  end subroutine fstr_heat_init
52 
53  !-----------------------------------------------------------------------------!
55  !-----------------------------------------------------------------------------!
56 
57  subroutine fstr_setup_heat( ctrl, P )
58  implicit none
59  integer(kind=kint) :: ctrl
60  type(fstr_param_pack) :: P
61 
62  integer(kind=kint) :: rcode
63  integer(kind=kint) :: n
64  character(len=HECMW_NAME_LEN) :: mName
65  integer(kind=kint) :: i
66 
67  n = fstr_ctrl_get_data_line_n( ctrl )
68 
69  if( n == 0 ) return
70 
71  call reallocate_real( p%PARAM%dtime, n)
72  call reallocate_real( p%PARAM%etime, n)
73  call reallocate_real( p%PARAM%dtmin, n)
74  call reallocate_real( p%PARAM%delmax,n)
75  call reallocate_integer( p%PARAM%itmax, n)
76  call reallocate_real( p%PARAM%eps, n)
77  p%PARAM%analysis_n = n
78 
79  p%PARAM%dtime = 0
80  p%PARAM%etime = 0
81  p%PARAM%dtmin = 0
82  p%PARAM%delmax = 0
83  p%PARAM%itmax = 20
84  p%PARAM%eps = 1.0e-6
85  p%PARAM%timepoint_id = 0
86 
87  rcode = fstr_ctrl_get_heat( ctrl, &
88  p%PARAM%dtime, &
89  p%PARAM%etime, &
90  p%PARAM%dtmin, &
91  p%PARAM%delmax, &
92  p%PARAM%itmax, &
93  p%PARAM%eps, &
94  mname, &
95  p%HEAT%beta)
96  if( rcode /= 0 ) then
98  end if
99 
100  if( associated(p%PARAM%timepoints) ) then
101  do i=1,size(p%PARAM%timepoints)
102  if( hecmw_streqr( p%PARAM%timepoints(i)%name, mname ) ) then
103  p%PARAM%timepoint_id = i; exit
104  endif
105  enddo
106  endif
107 
108  call reallocate_real( p%HEAT%STEP_DLTIME, n)
109  call reallocate_real( p%HEAT%STEP_EETIME, n)
110  call reallocate_real( p%HEAT%STEP_DELMIN, n)
111  call reallocate_real( p%HEAT%STEP_DELMAX, n)
112  p%HEAT%STEPtot = n
113 
114  p%HEAT%STEP_DLTIME = p%PARAM%dtime
115  p%HEAT%STEP_EETIME = p%PARAM%etime
116  p%HEAT%STEP_DELMIN = p%PARAM%dtmin
117  p%HEAT%STEP_DELMAX = p%PARAM%delmax
118  p%HEAT%timepoint_id = p%PARAM%timepoint_id
119 
120  end subroutine fstr_setup_heat
121 
122  !-----------------------------------------------------------------------------!
124  !-----------------------------------------------------------------------------!
125 
126  subroutine fstr_setup_fixtemp( ctrl, P )
127  implicit none
128  integer(kind=kint) :: ctrl
129  type(fstr_param_pack) :: P
130 
131  integer(kind=kint) :: rcode
132  character(HECMW_NAME_LEN) :: amp
133  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
134  real(kind=kreal),pointer :: value(:)
135  integer(kind=kint) :: n
136  ! ------------------------------------------------
137 
138  n = fstr_ctrl_get_data_line_n( ctrl )
139  if( n == 0 ) return
140 
141  allocate( grp_id_name(n))
142  allocate( value(n))
143 
144  amp = ' '
145  rcode = fstr_ctrl_get_fixtemp( ctrl, amp, &
146  grp_id_name, hecmw_name_len, value )
147  if( rcode /= 0 ) call fstr_ctrl_err_stop
148 
149  call fstr_heat_append_fixtemp( p%MESH, p%PARAM, p%HEAT, '!FIXTEMP', amp, n, grp_id_name, value )
150 
151  deallocate( grp_id_name )
152  deallocate( value )
153  end subroutine fstr_setup_fixtemp
154 
155  !-----------------------------------------------------------------------------!
157  !-----------------------------------------------------------------------------!
158 
159  subroutine fstr_setup_cflux( ctrl, P )
160  implicit none
161  integer(kind=kint) :: ctrl
162  type(fstr_param_pack) :: P
163 
164  integer(kind=kint) :: rcode
165  character(HECMW_NAME_LEN) :: amp
166  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
167  real(kind=kreal),pointer :: value(:)
168  integer(kind=kint) :: n
169  ! ------------------------------------------------
170 
171  n = fstr_ctrl_get_data_line_n( ctrl )
172  if( n == 0 ) return
173 
174  allocate( grp_id_name(n))
175  allocate( value(n))
176 
177  amp = ' '
178  rcode = fstr_ctrl_get_cflux( ctrl, amp, &
179  grp_id_name, hecmw_name_len, value )
180  if( rcode /= 0 ) call fstr_ctrl_err_stop
181 
182  call fstr_heat_append_cflux( p%MESH, p%HEAT, '!CFLUX', amp, n, grp_id_name, value )
183 
184  deallocate( grp_id_name )
185  deallocate( value )
186  end subroutine fstr_setup_cflux
187 
188  !-----------------------------------------------------------------------------!
190  !-----------------------------------------------------------------------------!
191 
192 
193  subroutine fstr_setup_dflux( ctrl, P )
194  implicit none
195  integer(kind=kint) :: ctrl
196  type(fstr_param_pack) :: P
197 
198  integer(kind=kint) :: rcode
199  character(HECMW_NAME_LEN) :: amp
200  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
201  integer(kind=kint),pointer :: load_type(:)
202  real(kind=kreal),pointer :: value(:)
203  integer(kind=kint) :: n
204  ! ------------------------------------------------
205 
206  n = fstr_ctrl_get_data_line_n( ctrl )
207  if( n == 0 ) return
208 
209  allocate( grp_id_name(n))
210  allocate( load_type(n))
211  allocate( value(n))
212 
213  amp = ' '
214  rcode = fstr_ctrl_get_dflux( ctrl, amp, &
215  grp_id_name, hecmw_name_len, load_type, value )
216  if( rcode /= 0 ) call fstr_ctrl_err_stop
217 
218  call fstr_heat_append_dflux( p%MESH, p%HEAT, '!DFLUX', amp, n, grp_id_name, load_type, value )
219 
220  deallocate( grp_id_name )
221  deallocate( load_type )
222  deallocate( value )
223  end subroutine fstr_setup_dflux
224 
225  !-----------------------------------------------------------------------------!
227  !-----------------------------------------------------------------------------!
228 
229 
230  subroutine fstr_setup_sflux( ctrl, P )
231  implicit none
232  integer(kind=kint) :: ctrl
233  type(fstr_param_pack) :: P
234 
235  integer(kind=kint) :: rcode
236  character(HECMW_NAME_LEN) :: amp
237  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
238  real(kind=kreal),pointer :: value(:)
239  integer(kind=kint) :: n
240  ! ------------------------------------------------
241 
242  n = fstr_ctrl_get_data_line_n( ctrl )
243  if( n == 0 ) return
244 
245  allocate( grp_id_name(n))
246  allocate( value(n))
247 
248  amp = ' '
249  rcode = fstr_ctrl_get_sflux( ctrl, amp, &
250  grp_id_name, hecmw_name_len, value )
251  if( rcode /= 0 ) call fstr_ctrl_err_stop
252 
253  call fstr_heat_append_sflux( p%MESH, p%HEAT, '!SFLUX', amp, n, grp_id_name, value )
254 
255  deallocate( grp_id_name )
256  deallocate( value )
257  end subroutine fstr_setup_sflux
258 
259  !-----------------------------------------------------------------------------!
261  !-----------------------------------------------------------------------------!
262 
263 
264  subroutine fstr_setup_film( ctrl, P )
265  implicit none
266  integer(kind=kint) :: ctrl
267  type(fstr_param_pack) :: P
268 
269  integer(kind=kint) :: rcode
270  character(HECMW_NAME_LEN) :: amp1, amp2
271  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
272  integer(kind=kint),pointer :: load_type(:)
273  real(kind=kreal),pointer :: value(:)
274  real(kind=kreal),pointer :: shink(:)
275  integer(kind=kint) :: n
276  ! ------------------------------------------------
277 
278  n = fstr_ctrl_get_data_line_n( ctrl )
279  if( n == 0 ) return
280 
281  allocate( grp_id_name(n))
282  allocate( load_type(n))
283  allocate( value(n))
284  allocate( shink(n))
285 
286  amp1 = ' '
287  amp2 = ' '
288 
289  rcode = fstr_ctrl_get_film( ctrl, amp1, amp2, &
290  grp_id_name, hecmw_name_len, load_type, value, shink )
291  if( rcode /= 0 ) call fstr_ctrl_err_stop
292 
293  call fstr_heat_append_film( p%MESH, p%HEAT, '!FILM', amp1, amp2, &
294  n, grp_id_name, load_type, value, shink )
295 
296  deallocate( grp_id_name )
297  deallocate( load_type )
298  deallocate( value )
299  deallocate( shink )
300  end subroutine fstr_setup_film
301 
302  !-----------------------------------------------------------------------------!
304  !-----------------------------------------------------------------------------!
305 
306 
307  subroutine fstr_setup_sfilm( ctrl, P )
308  implicit none
309  integer(kind=kint) :: ctrl
310  type(fstr_param_pack) :: P
311 
312  integer(kind=kint) :: rcode
313  character(HECMW_NAME_LEN) :: amp1, amp2
314  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
315  real(kind=kreal),pointer :: value(:)
316  real(kind=kreal),pointer :: shink(:)
317  integer(kind=kint) :: n
318  ! ------------------------------------------------
319 
320  n = fstr_ctrl_get_data_line_n( ctrl )
321  if( n == 0 ) return
322 
323  allocate( grp_id_name(n))
324  allocate( value(n))
325  allocate( shink(n))
326 
327  amp1 = ' '
328  amp2 = ' '
329  rcode = fstr_ctrl_get_sfilm( ctrl, amp1, amp2, &
330  grp_id_name, hecmw_name_len, value, shink )
331  if( rcode /= 0 ) call fstr_ctrl_err_stop
332 
333  call fstr_heat_append_sfilm( p%MESH, p%HEAT, '!SFILM', amp1, amp2, &
334  n, grp_id_name, value, shink )
335 
336  deallocate( grp_id_name )
337  deallocate( value )
338  deallocate( shink )
339  end subroutine fstr_setup_sfilm
340 
341  !-----------------------------------------------------------------------------!
343  !-----------------------------------------------------------------------------!
344 
345 
346  subroutine fstr_setup_radiate( ctrl, P )
347  implicit none
348  integer(kind=kint) :: ctrl
349  type(fstr_param_pack) :: P
350 
351  integer(kind=kint) :: rcode
352  character(HECMW_NAME_LEN) :: amp1, amp2
353  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
354  integer(kind=kint),pointer :: load_type(:)
355  real(kind=kreal),pointer :: value(:)
356  real(kind=kreal),pointer :: shink(:)
357  integer(kind=kint) :: n
358  ! ------------------------------------------------
359 
360  n = fstr_ctrl_get_data_line_n( ctrl )
361  if( n == 0 ) return
362 
363  allocate( grp_id_name(n))
364  allocate( load_type(n))
365  allocate( value(n))
366  allocate( shink(n))
367 
368  amp1 = ' '
369  amp2 = ' '
370  rcode = fstr_ctrl_get_radiate( ctrl, amp1, amp2, &
371  grp_id_name, hecmw_name_len, load_type, value, shink )
372  if( rcode /= 0 ) call fstr_ctrl_err_stop
373 
374  call fstr_heat_append_radiate( p%MESH, p%HEAT, '!RADIATE', amp1, amp2, &
375  n, grp_id_name, load_type, value, shink )
376 
377  deallocate( grp_id_name )
378  deallocate( load_type )
379  deallocate( value )
380  deallocate( shink )
381  end subroutine fstr_setup_radiate
382 
383  !-----------------------------------------------------------------------------!
385  !-----------------------------------------------------------------------------!
386 
387 
388  subroutine fstr_setup_sradiate( ctrl, P )
389  implicit none
390  integer(kind=kint) :: ctrl
391  type(fstr_param_pack) :: P
392 
393  integer(kind=kint) :: rcode
394  character(HECMW_NAME_LEN) :: amp1, amp2
395  character(HECMW_NAME_LEN), pointer :: grp_id_name(:)
396  real(kind=kreal),pointer :: value(:)
397  real(kind=kreal),pointer :: shink(:)
398  integer(kind=kint) :: n
399  ! ------------------------------------------------
400 
401  n = fstr_ctrl_get_data_line_n( ctrl )
402  if( n == 0 ) return
403 
404  allocate( grp_id_name(n))
405  allocate( value(n))
406  allocate( shink(n))
407 
408  amp1 = ' '
409  amp2 = ' '
410  rcode = fstr_ctrl_get_sradiate( ctrl, amp1, amp2, grp_id_name, hecmw_name_len, value, shink )
411  if( rcode /= 0 ) call fstr_ctrl_err_stop
412 
413  call fstr_heat_append_sradiate( p%MESH, p%HEAT, '!SRADIATE', amp1, amp2, &
414  n, grp_id_name, value, shink )
415 
416  deallocate( grp_id_name )
417  deallocate( value )
418  deallocate( shink )
419  end subroutine fstr_setup_sradiate
420 
421  !-----------------------------------------------------------------------------!
423  !-----------------------------------------------------------------------------!
424  subroutine fstr_setup_weld_line( ctrl, P )
425  implicit none
426  integer(kind=kint) :: ctrl
427  type(fstr_param_pack) :: P
428 
429  type(hecmwst_local_mesh), pointer :: hecMESH
430  type(fstr_heat), pointer :: fstrHEAT
431  type(fstr_card_slot) :: slot
432 
433  slot = p%STATE%slot
434  hecmesh => p%MESH
435  fstrheat => p%HEAT
436 
437  fstrheat%WL_tot = slot%last
438  if( fstr_ctrl_get_weldline( ctrl, hecmesh, hecmw_name_len, fstrheat%weldline(fstrheat%WL_tot) )/=0 ) then
439  write(*,*) '### Error: Fail in read in Weld Line definition : ' , fstrheat%WL_tot
440  write(ilog,*) '### Error: Fail in read in Weld Line definition : ', fstrheat%WL_tot
441  stop hecmw_exit_input
442  endif
443  end subroutine fstr_setup_weld_line
444 
445  !-----------------------------------------------------------------------------!
447  !-----------------------------------------------------------------------------!
448  subroutine fstr_heat_append_fixtemp( hecMESH, fstrPARAM, fstrHEAT, header_name, &
449  amp_name, n, grp_names, vals )
450  implicit none
451  type(hecmwst_local_mesh), target :: hecMESH
452  type(fstr_param), target :: fstrPARAM
453  type(fstr_heat) :: fstrHEAT
454  character(len=*), intent(in) :: header_name
455  character(len=HECMW_NAME_LEN), intent(in) :: amp_name
456  integer(kind=kint), intent(in) :: n
457  character(len=HECMW_NAME_LEN), intent(in) :: grp_names(:)
458  real(kind=kreal), intent(in) :: vals(:)
459 
460  integer(kind=kint) :: amp_id
461  integer(kind=kint) :: i, j, m, head, id, member_n, old_size, new_size
462  integer(kind=kint),pointer :: member(:)
463  integer(kind=kint) :: local_id, rtc
464 
465  if( n == 0 ) return
466  call amp_name_to_id( hecmesh, header_name, amp_name, amp_id )
467 
468  m = 0
469  do i = 1, n
470  !rtc = get_local_member_index( hecMESH, 'node', grp_names(i), local_id )
471  rtc = get_sorted_local_member_index( hecmesh, fstrparam, 'node', grp_names(i), local_id )
472  if( rtc > 0 ) then
473  m = m + 1
474  else if( rtc < 0 ) then
475  m = m + get_grp_member_n( hecmesh, 'node_grp', grp_names(i) )
476  end if
477  end do
478 
479  if (m == 0) return
480 
481  ! JP-8
482  old_size = fstrheat%T_FIX_tot
483  new_size = old_size + m
484  call hecmw_expand_integer_array( fstrheat%T_FIX_node, old_size, new_size )
485  call hecmw_expand_integer_array( fstrheat%T_FIX_ampl, old_size, new_size )
486  call hecmw_expand_real_array( fstrheat%T_FIX_val, old_size, new_size )
487  fstrheat%T_FIX_tot = new_size
488 
489  head = old_size + 1
490  member => fstrheat%T_FIX_node(head:)
491  id = head
492  do i = 1, n
493  !rtc = get_local_member_index( hecMESH, 'node', grp_names(i), local_id )
494  rtc = get_sorted_local_member_index( hecmesh, fstrparam, 'node', grp_names(i), local_id )
495  if( rtc > 0 ) then
496  member(1) = local_id
497  member_n = 1
498  else if( rtc < 0 ) then
499  member_n = get_grp_member( hecmesh, 'node_grp', grp_names(i), member )
500  else
501  cycle
502  end if
503  if( i<n ) then
504  member => member( member_n+1 : )
505  endif
506  do j = 1, member_n
507  fstrheat%T_FIX_val (id) = vals(i)
508  fstrheat%T_FIX_ampl (id) = amp_id
509  id = id + 1
510  end do
511  end do
512 
513  end subroutine fstr_heat_append_fixtemp
514 
515  !-----------------------------------------------------------------------------!
517  !-----------------------------------------------------------------------------!
518  subroutine fstr_heat_append_cflux( hecMESH, fstrHEAT, header_name, amp_name, n, grp_names, vals )
519  implicit none
520  type(hecmwst_local_mesh), target :: hecMESH
521  type(fstr_heat) :: fstrHEAT
522  character(len=*), intent(in) :: header_name
523  character(len=HECMW_NAME_LEN), intent(in) :: amp_name
524  integer(kind=kint), intent(in) :: n
525  character(len=HECMW_NAME_LEN), intent(in) :: grp_names(:)
526  real(kind=kreal), intent(in) :: vals(:)
527 
528  integer(kind=kint) :: amp_id
529  integer(kind=kint) :: i, j, m, head, id, member_n, old_size, new_size
530  integer(kind=kint),pointer :: member(:)
531  integer(kind=kint) :: local_id, rtc
532 
533  if( n == 0 ) return
534  call amp_name_to_id( hecmesh, header_name, amp_name, amp_id )
535 
536  m = 0
537 
538  do i = 1, n
539  rtc = get_local_member_index( hecmesh, 'node', grp_names(i), local_id )
540  if( rtc > 0 ) then
541  m = m + 1
542  else if( rtc < 0 ) then
543  m = m + get_grp_member_n( hecmesh, 'node_grp', grp_names(i) )
544  end if
545  end do
546 
547  if (m == 0) return
548 
549  ! JP-9
550  old_size = fstrheat%Q_NOD_tot
551  new_size = old_size + m
552  call hecmw_expand_integer_array( fstrheat%Q_NOD_node, old_size, new_size )
553  call hecmw_expand_integer_array( fstrheat%Q_NOD_ampl, old_size, new_size )
554  call hecmw_expand_real_array( fstrheat%Q_NOD_val, old_size, new_size )
555  fstrheat%Q_NOD_tot = new_size
556 
557  head = old_size + 1
558  member => fstrheat%Q_NOD_node(head:)
559  id = head
560  do i = 1, n
561  rtc = get_local_member_index( hecmesh, 'node', grp_names(i), local_id )
562  if( rtc > 0 ) then
563  member(1) = local_id
564  member_n = 1
565  else if( rtc < 0 ) then
566  member_n = get_grp_member( hecmesh, 'node_grp', grp_names(i), member )
567  else
568  cycle
569  end if
570  if( i<n ) member => member( member_n+1 : )
571  do j = 1, member_n
572  fstrheat%Q_NOD_val (id) = vals(i)
573  fstrheat%Q_NOD_ampl (id) = amp_id
574  id = id + 1
575  end do
576  end do
577 
578  end subroutine fstr_heat_append_cflux
579 
580  !-----------------------------------------------------------------------------!
582  !-----------------------------------------------------------------------------!
583  subroutine fstr_heat_append_dflux( hecMESH, fstrHEAT, header_name, amp_name, n, grp_names, &
584  load_types, vals )
585  implicit none
586  type(hecmwst_local_mesh), target :: hecMESH
587  type(fstr_heat) :: fstrHEAT
588  character(len=*), intent(in) :: header_name
589  character(len=HECMW_NAME_LEN), intent(in) :: amp_name
590  integer(kind=kint), intent(in) :: n
591  character(len=HECMW_NAME_LEN), intent(in) :: grp_names(:)
592  integer(kind=kint), intent(in) :: load_types(:)
593  real(kind=kreal), intent(in) :: vals(:)
594 
595  integer(kind=kint) :: amp_id
596  integer(kind=kint) :: i, j, m, head, id, member_n, old_size, new_size
597  integer(kind=kint),pointer :: member(:)
598  integer(kind=kint) :: local_id, rtc
599 
600  if( n == 0 ) return
601  call amp_name_to_id( hecmesh, header_name, amp_name, amp_id )
602 
603  m = 0
604  do i = 1, n
605  rtc = get_local_member_index( hecmesh, 'element', grp_names(i), local_id )
606  if( rtc > 0 ) then
607  m = m + 1
608  else if( rtc < 0 ) then
609  m = m + get_grp_member_n( hecmesh, 'elem_grp', grp_names(i) )
610  end if
611  end do
612 
613  if (m == 0) return
614 
615  ! JP-10
616  old_size = fstrheat%Q_SUF_tot
617  new_size = old_size + m
618  call hecmw_expand_integer_array( fstrheat%Q_SUF_elem, old_size, new_size )
619  call hecmw_expand_integer_array( fstrheat%Q_SUF_ampl, old_size, new_size )
620  call hecmw_expand_integer_array( fstrheat%Q_SUF_surf, old_size, new_size )
621  call hecmw_expand_real_array( fstrheat%Q_SUF_val, old_size, new_size )
622  fstrheat%Q_SUF_tot = new_size
623 
624  head = old_size + 1
625  member => fstrheat%Q_SUF_elem(head:)
626  id = head
627  do i = 1, n
628  rtc = get_local_member_index( hecmesh, 'element', grp_names(i), local_id )
629  if( rtc > 0 ) then
630  member(1) = local_id
631  member_n = 1
632  else if( rtc < 0 ) then
633  member_n = get_grp_member( hecmesh, 'elem_grp', grp_names(i), member )
634  else
635  cycle
636  end if
637  if( i<n ) member => member( member_n+1 : )
638  do j = 1, member_n
639  fstrheat%Q_SUF_surf (id) = load_types(i)
640  fstrheat%Q_SUF_val (id) = vals(i)
641  fstrheat%Q_SUF_ampl (id) = amp_id
642  id = id + 1
643  end do
644  end do
645 
646  end subroutine fstr_heat_append_dflux
647 
648  !-----------------------------------------------------------------------------!
650  !-----------------------------------------------------------------------------!
651  subroutine fstr_heat_append_sflux( hecMESH, fstrHEAT, header_name, amp_name, n, grp_names, vals )
652  implicit none
653  type(hecmwst_local_mesh), target :: hecMESH
654  type(fstr_heat) :: fstrHEAT
655  character(len=*), intent(in) :: header_name
656  character(len=HECMW_NAME_LEN), intent(in) :: amp_name
657  integer(kind=kint), intent(in) :: n
658  character(len=HECMW_NAME_LEN), intent(in) :: grp_names(:)
659  real(kind=kreal), intent(in) :: vals(:)
660 
661  integer(kind=kint) :: amp_id
662  integer(kind=kint) :: i, j, m, head, id, member_n, old_size, new_size
663  integer(kind=kint),pointer :: member1(:), member2(:)
664 
665  if( n == 0 ) return
666  call amp_name_to_id( hecmesh, header_name, amp_name, amp_id )
667 
668  m = 0
669  do i = 1, n
670  m = m + get_grp_member_n( hecmesh, 'surf_grp', grp_names(i) )
671  end do
672 
673  if (m == 0) return
674 
675  ! JP-11
676  old_size = fstrheat%Q_SUF_tot
677  new_size = old_size + m
678  call hecmw_expand_integer_array( fstrheat%Q_SUF_elem, old_size, new_size )
679  call hecmw_expand_integer_array( fstrheat%Q_SUF_ampl, old_size, new_size )
680  call hecmw_expand_integer_array( fstrheat%Q_SUF_surf, old_size, new_size )
681  call hecmw_expand_real_array( fstrheat%Q_SUF_val, old_size, new_size )
682  fstrheat%Q_SUF_tot = new_size
683 
684  head = old_size + 1
685  member1 => fstrheat%Q_SUF_elem(head:)
686  member2 => fstrheat%Q_SUF_surf(head:)
687  id = head
688  do i = 1, n
689  member_n = get_grp_member( hecmesh, 'surf_grp', grp_names(i), member1, member2 )
690  if( i<n ) then
691  member1 => member1( member_n+1 : )
692  member2 => member2( member_n+1 : )
693  end if
694  do j = 1, member_n
695  fstrheat%Q_SUF_val (id) = vals(i)
696  fstrheat%Q_SUF_ampl (id) = amp_id
697  id = id + 1
698  end do
699  end do
700 
701  end subroutine fstr_heat_append_sflux
702 
703  !-----------------------------------------------------------------------------!
705  !-----------------------------------------------------------------------------!
706  subroutine fstr_heat_append_film( hecMESH, fstrHEAT, header_name, amp_name1, amp_name2, &
707  n, grp_names, load_types, vals, sinks )
708  implicit none
709  type(hecmwst_local_mesh), target :: hecMESH
710  type(fstr_heat) :: fstrHEAT
711  character(len=*), intent(in) :: header_name
712  character(len=HECMW_NAME_LEN), intent(in) :: amp_name1, amp_name2
713  integer(kind=kint), intent(in) :: n
714  character(len=HECMW_NAME_LEN), intent(in) :: grp_names(:)
715  integer(kind=kint), intent(in) :: load_types(:)
716  real(kind=kreal), intent(in) :: vals(:)
717  real(kind=kreal), intent(in) :: sinks(:)
718 
719  integer(kind=kint) :: amp_id1, amp_id2
720  integer(kind=kint) :: i, j, m, head, id, member_n, old_size, new_size
721  integer(kind=kint),pointer :: member(:)
722  integer(kind=kint) :: local_id, rtc
723 
724  if( n == 0 ) return
725  call amp_name_to_id( hecmesh, header_name, amp_name1, amp_id1 )
726  call amp_name_to_id( hecmesh, header_name, amp_name2, amp_id2 )
727 
728  m = 0
729  do i = 1, n
730  rtc = get_local_member_index( hecmesh, 'element', grp_names(i), local_id )
731  if( rtc > 0 ) then
732  m = m + 1
733  else if( rtc < 0 ) then
734  m = m + get_grp_member_n( hecmesh, 'elem_grp', grp_names(i) )
735  end if
736  end do
737 
738  if (m == 0) return
739 
740  ! JP-12
741  old_size = fstrheat%H_SUF_tot
742  new_size = old_size + m
743  call hecmw_expand_integer_array( fstrheat%H_SUF_elem, old_size, new_size )
744  call hecmw_expand_integer_array2( fstrheat%H_SUF_ampl, 2, old_size, new_size )
745  call hecmw_expand_integer_array( fstrheat%H_SUF_surf, old_size, new_size )
746  call hecmw_expand_real_array2( fstrheat%H_SUF_val, 2, old_size, new_size )
747  fstrheat%H_SUF_tot = new_size
748 
749  head = old_size + 1
750  member => fstrheat%H_SUF_elem(head:)
751  id = head
752  do i = 1, n
753  rtc = get_local_member_index( hecmesh, 'element', grp_names(i), local_id )
754  if( rtc > 0 ) then
755  member(1) = local_id
756  member_n = 1
757  else if( rtc < 0 ) then
758  member_n = get_grp_member( hecmesh, 'elem_grp', grp_names(i), member )
759  else
760  cycle
761  end if
762  if( i<n ) member => member( member_n+1 : )
763  do j = 1, member_n
764  fstrheat%H_SUF_surf (id) = load_types(i)
765  fstrheat%H_SUF_val (id,1) = vals(i)
766  fstrheat%H_SUF_val (id,2) = sinks(i)
767  fstrheat%H_SUF_ampl (id,1) = amp_id1
768  fstrheat%H_SUF_ampl (id,2) = amp_id2
769  id= id + 1
770  end do
771  end do
772 
773  end subroutine fstr_heat_append_film
774 
775  !-----------------------------------------------------------------------------!
777  !-----------------------------------------------------------------------------!
778  subroutine fstr_heat_append_sfilm( hecMESH, fstrHEAT, header_name, amp_name1, amp_name2, &
779  n, grp_names, vals, sinks )
780  implicit none
781  type(hecmwst_local_mesh), target :: hecMESH
782  type(fstr_heat) :: fstrHEAT
783  character(len=*), intent(in) :: header_name
784  character(len=HECMW_NAME_LEN), intent(in) :: amp_name1, amp_name2
785  integer(kind=kint), intent(in) :: n
786  character(len=HECMW_NAME_LEN), intent(in) :: grp_names(:)
787  real(kind=kreal), intent(in) :: vals(:)
788  real(kind=kreal), intent(in) :: sinks(:)
789 
790  integer(kind=kint) :: amp_id1, amp_id2
791  integer(kind=kint) :: i, j, m, head, id, member_n, old_size, new_size
792  integer(kind=kint),pointer :: member1(:), member2(:)
793 
794  if( n == 0 ) return
795  call amp_name_to_id( hecmesh, header_name, amp_name1, amp_id1 )
796  call amp_name_to_id( hecmesh, header_name, amp_name2, amp_id2 )
797 
798  m = 0
799  do i = 1, n
800  m = m + get_grp_member_n( hecmesh, 'surf_grp', grp_names(i) )
801  end do
802 
803  if (m == 0) return
804 
805  ! JP-13
806  old_size = fstrheat%H_SUF_tot
807  new_size = old_size + m
808  call hecmw_expand_integer_array( fstrheat%H_SUF_elem, old_size, new_size )
809  call hecmw_expand_integer_array2( fstrheat%H_SUF_ampl, 2, old_size, new_size )
810  call hecmw_expand_integer_array( fstrheat%H_SUF_surf, old_size, new_size )
811  call hecmw_expand_real_array2( fstrheat%H_SUF_val, 2, old_size, new_size )
812  fstrheat%H_SUF_tot = new_size
813 
814  head = old_size + 1
815  member1 => fstrheat%H_SUF_elem(head:)
816  member2 => fstrheat%H_SUF_surf(head:)
817  id = head
818  do i = 1, n
819  member_n = get_grp_member( hecmesh, 'surf_grp', grp_names(i), member1, member2 )
820  if( i<n ) then
821  member1 => member1( member_n+1 : )
822  member2 => member2( member_n+1 : )
823  end if
824  do j = 1, member_n
825  fstrheat%H_SUF_val (id,1) = vals(i)
826  fstrheat%H_SUF_val (id,2) = sinks(i)
827  fstrheat%H_SUF_ampl (id,1) = amp_id1
828  fstrheat%H_SUF_ampl (id,2) = amp_id2
829  id = id + 1
830  end do
831  end do
832 
833  end subroutine fstr_heat_append_sfilm
834 
835  !-----------------------------------------------------------------------------!
837  !-----------------------------------------------------------------------------!
838  subroutine fstr_heat_append_radiate( hecMESH, fstrHEAT, header_name, amp_name1, amp_name2, &
839  n, grp_names, load_types, vals, sinks )
840  implicit none
841  type(hecmwst_local_mesh), target :: hecMESH
842  type(fstr_heat) :: fstrHEAT
843  character(len=*), intent(in) :: header_name
844  character(len=HECMW_NAME_LEN), intent(in) :: amp_name1, amp_name2
845  integer(kind=kint), intent(in) :: n
846  character(len=HECMW_NAME_LEN), intent(in) :: grp_names(:)
847  integer(kind=kint), intent(in) :: load_types(:)
848  real(kind=kreal), intent(in) :: vals(:)
849  real(kind=kreal), intent(in) :: sinks(:)
850 
851  integer(kind=kint) :: amp_id1, amp_id2
852  integer(kind=kint) :: i, j, m, head, id, member_n, old_size, new_size
853  integer(kind=kint),pointer :: member(:)
854  integer(kind=kint) :: local_id, rtc
855 
856  if( n == 0 ) return
857  call amp_name_to_id( hecmesh, header_name, amp_name1, amp_id1 )
858  call amp_name_to_id( hecmesh, header_name, amp_name2, amp_id2 )
859 
860  m = 0
861  do i = 1, n
862  rtc = get_local_member_index( hecmesh, 'element', grp_names(i), local_id )
863  if( rtc > 0 ) then
864  m = m + 1
865  else if( rtc < 0 ) then
866  m = m + get_grp_member_n( hecmesh, 'elem_grp', grp_names(i) )
867  end if
868  end do
869 
870  if (m == 0) return
871 
872  ! JP-14
873  old_size = fstrheat%R_SUF_tot
874  new_size = old_size + m
875  call hecmw_expand_integer_array( fstrheat%R_SUF_elem, old_size, new_size )
876  call hecmw_expand_integer_array2( fstrheat%R_SUF_ampl, 2, old_size, new_size )
877  call hecmw_expand_integer_array( fstrheat%R_SUF_surf, old_size, new_size )
878  call hecmw_expand_real_array2( fstrheat%R_SUF_val, 2, old_size, new_size )
879  fstrheat%R_SUF_tot = new_size
880 
881  head = old_size + 1
882  member => fstrheat%R_SUF_elem(head:)
883  id = head
884  do i = 1, n
885  rtc = get_local_member_index( hecmesh, 'element', grp_names(i), local_id )
886  if( rtc > 0 ) then
887  member(1) = local_id
888  member_n = 1
889  else if( rtc < 0 ) then
890  member_n = get_grp_member( hecmesh, 'elem_grp', grp_names(i), member )
891  else
892  cycle
893  end if
894  if( i<n ) member => member( member_n+1 : )
895  do j = 1, member_n
896  fstrheat%R_SUF_surf (id) = load_types(i)
897  fstrheat%R_SUF_val (id,1) = vals(i)
898  fstrheat%R_SUF_val (id,2) = sinks(i)
899  fstrheat%R_SUF_ampl (id,1) = amp_id1
900  fstrheat%R_SUF_ampl (id,2) = amp_id2
901  id = id + 1
902  end do
903  end do
904 
905  end subroutine fstr_heat_append_radiate
906 
907  !-----------------------------------------------------------------------------!
909  !-----------------------------------------------------------------------------!
910  subroutine fstr_heat_append_sradiate( hecMESH, fstrHEAT, header_name, amp_name1, amp_name2, &
911  n, grp_names, vals, sinks )
912  implicit none
913  type(hecmwst_local_mesh), target :: hecMESH
914  type(fstr_heat) :: fstrHEAT
915  character(len=*), intent(in) :: header_name
916  character(len=HECMW_NAME_LEN), intent(in) :: amp_name1, amp_name2
917  integer(kind=kint), intent(in) :: n
918  character(len=HECMW_NAME_LEN), intent(in) :: grp_names(:)
919  real(kind=kreal), intent(in) :: vals(:)
920  real(kind=kreal), intent(in) :: sinks(:)
921 
922  integer(kind=kint) :: amp_id1, amp_id2
923  integer(kind=kint) :: i, j, m, head, id, member_n, old_size, new_size
924  integer(kind=kint),pointer :: member1(:), member2(:)
925 
926  if( n == 0 ) return
927  call amp_name_to_id( hecmesh, header_name, amp_name1, amp_id1 )
928  call amp_name_to_id( hecmesh, header_name, amp_name2, amp_id2 )
929 
930  m = 0
931  do i = 1, n
932  m = m + get_grp_member_n( hecmesh, 'surf_grp', grp_names(i) )
933  end do
934 
935  if (m == 0) return
936 
937  ! JP-15
938  old_size = fstrheat%R_SUF_tot
939  new_size = old_size + m
940  call hecmw_expand_integer_array( fstrheat%R_SUF_elem, old_size, new_size )
941  call hecmw_expand_integer_array2( fstrheat%R_SUF_ampl, 2, old_size, new_size )
942  call hecmw_expand_integer_array( fstrheat%R_SUF_surf, old_size, new_size )
943  call hecmw_expand_real_array2( fstrheat%R_SUF_val, 2, old_size, new_size )
944  fstrheat%R_SUF_tot = new_size
945 
946  head = old_size + 1
947  member1 => fstrheat%R_SUF_elem(head:)
948  member2 => fstrheat%R_SUF_surf(head:)
949  id = head
950  do i = 1, n
951  member_n = get_grp_member( hecmesh, 'surf_grp', grp_names(i), member1, member2 )
952  if( i<n ) then
953  member1 => member1( member_n+1 : )
954  member2 => member2( member_n+1 : )
955  end if
956  do j = 1, member_n
957  fstrheat%R_SUF_val (id,1) = vals(i)
958  fstrheat%R_SUF_val (id,2) = sinks(i)
959  fstrheat%R_SUF_ampl (id,1) = amp_id1
960  fstrheat%R_SUF_ampl (id,2) = amp_id2
961  id = id + 1
962  end do
963  end do
964 
965  end subroutine fstr_heat_append_sradiate
966 
967 end module m_fstr_heat_setup
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 contains auxiliary functions in calculation setup.
subroutine fstr_ctrl_err_stop
integer(kind=kint) function get_local_member_index(hecMESH, type_name, name, local_id)
subroutine amp_name_to_id(hecMESH, header_name, aname, id)
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)
This module contains auxiliary functions in calculation setup.
subroutine hecmw_expand_real_array2(array, column, old_size, new_size)
subroutine hecmw_expand_integer_array(array, old_size, new_size)
subroutine hecmw_expand_real_array(array, old_size, new_size)
integer(kind=kint) function get_grp_member(hecMESH, grp_type_name, name, member1, member2)
subroutine hecmw_expand_integer_array2(array, column, old_size, new_size)
integer(kind=kint) function get_grp_member_n(hecMESH, grp_type_name, name)
logical function hecmw_streqr(s1, s2)
This module provides subroutines to initialize fstr_heat and to read the cards of heat analysis into ...
subroutine fstr_setup_sfilm(ctrl, P)
Read in !SFILM !
subroutine fstr_setup_sradiate(ctrl, P)
Read in !SRADIATE !
subroutine fstr_heat_append_film(hecMESH, fstrHEAT, header_name, amp_name1, amp_name2, n, grp_names, load_types, vals, sinks)
Append !FILM !
subroutine fstr_heat_append_dflux(hecMESH, fstrHEAT, header_name, amp_name, n, grp_names, load_types, vals)
Append !DFLUX !
subroutine fstr_setup_dflux(ctrl, P)
Read in !DFLUX !
subroutine fstr_heat_append_radiate(hecMESH, fstrHEAT, header_name, amp_name1, amp_name2, n, grp_names, load_types, vals, sinks)
Append !RADIATE !
subroutine fstr_heat_append_sfilm(hecMESH, fstrHEAT, header_name, amp_name1, amp_name2, n, grp_names, vals, sinks)
Append !SFILM !
subroutine fstr_heat_init(fstrHEAT)
Initial setting of heat analysis.
subroutine fstr_setup_cflux(ctrl, P)
Read in !CFLUX !
subroutine fstr_heat_append_fixtemp(hecMESH, fstrPARAM, fstrHEAT, header_name, amp_name, n, grp_names, vals)
Append !FIXTEMP !
subroutine fstr_setup_heat(ctrl, P)
Read in !HEAT !
subroutine fstr_setup_sflux(ctrl, P)
Read in !SFLUX !
subroutine fstr_setup_film(ctrl, P)
Read in !FILM !
subroutine fstr_heat_append_sflux(hecMESH, fstrHEAT, header_name, amp_name, n, grp_names, vals)
Append !SFLUX !
subroutine fstr_setup_radiate(ctrl, P)
Read in !RADIATE !
subroutine fstr_heat_append_cflux(hecMESH, fstrHEAT, header_name, amp_name, n, grp_names, vals)
Append !CFLUX !
subroutine fstr_setup_fixtemp(ctrl, P)
Read in !FIXTEMP !
subroutine fstr_setup_weld_line(ctrl, P)
Read in !WELD_LINE !
subroutine fstr_heat_append_sradiate(hecMESH, fstrHEAT, header_name, amp_name1, amp_name2, n, grp_names, vals, sinks)
Append !SRADIATE !
This module defines common data and basic structures for analysis.
Definition: m_fstr.F90:15
integer(kind=kint), parameter ilog
FILE HANDLER.
Definition: m_fstr.F90:118
Places of a card in its sequence, from first to last. A card counted one by one has one place (first ...
Package of all data needs to initialize.
Data for HEAT ANSLYSIS (fstrHEAT)
Definition: m_fstr.F90:440
FSTR INNER CONTROL PARAMETERS (fstrPARAM)
Definition: m_fstr.F90:142