28 restrt_step_num, sub_step, ctime, dtime )
31 integer,
intent(in) :: cstep
32 type (hecmwST_local_mesh) :: hecMESH
33 type (hecmwST_matrix) :: hecMAT
34 type (fstr_solid) :: fstrSOLID
35 integer,
intent(in) :: sub_step
36 real(kind=kreal),
intent(in) :: ctime
37 real(kind=kreal),
intent(in) :: dtime
38 type (fstr_param) :: fstrPARAM
39 type (hecmwST_matrix_lagrange) :: hecLagMAT
41 type (hecmwST_local_mesh),
pointer :: hecMESHmpc
42 type (hecmwST_matrix),
pointer :: hecMATmpc
43 integer(kind=kint) :: ndof
44 integer(kind=kint) :: i, iter
45 integer(kind=kint) :: stepcnt
46 integer(kind=kint) :: restrt_step_num
47 real(kind=kreal) :: tt0, tt, res, qnrm, rres, tincr, xnrm, dunrm, rxnrm
48 logical :: isLinear = .false.
49 integer(kind=kint) :: iterStatus
51 real(kind=kreal),
allocatable :: z_k(:), s_k(:,:), y_k(:,:), g_prev(:), rho_k(:)
52 real(kind=kreal) :: sdoty
55 integer(kind=kint) :: k
58 integer :: max_iter_bak
59 logical :: flag_approx_Wolfe
61 max_iter_bak = fstrsolid%step_ctrl(cstep)%max_iter
62 fstrsolid%step_ctrl(cstep)%max_iter = 100*fstrsolid%step_ctrl(cstep)%max_iter
64 call hecmw_mpc_mat_init(hecmesh, hecmat, hecmeshmpc, hecmatmpc)
66 if(.not. fstrpr%nlgeom)
then
70 hecmat%NDOF = hecmesh%n_dof
76 if( fstrsolid%step_ctrl(cstep)%solution == stepstatic ) tincr = 0.d0
77 call fstr_init_newton(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, heclagmat, ndof, 0, hecmat)
78 fstrsolid%GL0(:) = fstrsolid%GL(:)
81 call fstr_addbc(cstep, hecmesh, hecmat, fstrsolid, fstrparam, heclagmat, 1, rhsvector=fstrsolid%dunode)
83 call fstr_calc_residual_vector(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam)
85 len_vector = hecmesh%n_node*ndof
86 allocate(z_k(len_vector))
89 allocate(g_prev(len_vector))
97 y_k(i,1) = -hecmat%B(i)
103 flag_approx_wolfe = .false.
106 do iter=1,fstrsolid%step_ctrl(cstep)%max_iter
110 do i=1,hecmesh%n_node*ndof
111 g_prev(i) = -hecmat%B(i)
128 call fstr_calc_residual_vector(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam)
132 ndof, iter, sub_step, cstep, &
137 if (iterstatus == kitrconverged)
exit
138 if (iterstatus == kitrdiverged .or. iterstatus==kitrfloatingerror)
return
144 s_k(:,k) = s_k(:,k-1)
145 y_k(:,k) = y_k(:,k-1)
146 rho_k(k) = rho_k(k-1)
149 do i = 1, hecmesh%n_node*ndof
150 s_k(i,1) = hecmat%X(i)
151 y_k(i,1) = -hecmat%B(i) - g_prev(i)
153 call hecmw_innerproduct_r(hecmesh,ndof,s_k(:,1), y_k(:,1), sdoty)
154 if (abs(sdoty) < 1.0d-10)
then
157 rho_k(1) = 1.0d0/sdoty
162 fstrsolid%NRstat_i(knstmaxit) = max(fstrsolid%NRstat_i(knstmaxit),iter)
163 fstrsolid%NRstat_i(knstsumit) = fstrsolid%NRstat_i(knstsumit) + iter
169 call fstr_updatestate( hecmesh, fstrsolid, tincr )
171 fstrsolid%CutBack_stat = 0
172 call hecmw_mpc_mat_finalize(hecmesh, hecmat, hecmeshmpc, hecmatmpc)
174 fstrsolid%step_ctrl(cstep)%max_iter = max_iter_bak
180 type (hecmwST_local_mesh) :: hecMESH
181 real(kind=kreal) :: z_k(:), s_k(:,:), y_k(:,:), g_prev(:), rho_k(:)
184 real(kind=kreal),
allocatable :: q(:)
185 real(kind=kreal) :: alpha(n_mem), beta
186 real(kind=kreal) :: sdotq, ysq, gamma, ydotz, g_max
188 integer :: len_vector, ndof
189 integer(kind=kint) :: k,i
192 len_vector = hecmesh%n_node*hecmesh%n_dof
193 allocate(q(len_vector))
195 q(1:len_vector) = g_prev(1:len_vector)
198 call hecmw_innerproduct_r(hecmesh,ndof,s_k(:,k), q, sdotq)
199 alpha(k) = rho_k(k) * sdotq
201 q(i) = q(i) - alpha(k)*y_k(i,k)
204 call hecmw_innerproduct_r(hecmesh,ndof,y_k(:,1), y_k(:,1), ysq)
206 call hecmw_absmax_r(hecmesh, ndof, g_prev, g_max)
213 else if (abs(rho_k(1)) < 1.0d-10)
then
216 gamma = 1.0d0/(rho_k(1)*ysq)
224 call hecmw_innerproduct_r(hecmesh,ndof,y_k(:,k), z_k, ydotz)
225 beta = rho_k(k)*ydotz
227 z_k(i)=z_k(i) + s_k(i,k)*(alpha(k)-beta)
235 type (hecmwST_local_mesh) :: hecMESH
236 type (fstr_solid) :: fstrSOLID
237 integer(kind=kint) :: cstep
238 real(kind=kreal) :: z_k(:)
240 integer(kind=kint) :: ig0, grpid, ig, ityp, idofS, idofE, iS0, iE0, ik, in, idof, ndof
244 do ig0 = 1, fstrsolid%BOUNDARY_ngrp_tot
245 grpid = fstrsolid%BOUNDARY_ngrp_GRPID(ig0)
246 if( .not. fstr_isboundaryactive( fstrsolid, grpid, cstep ) ) cycle
247 ig = fstrsolid%BOUNDARY_ngrp_ID(ig0)
248 ityp = fstrsolid%BOUNDARY_ngrp_type(ig0)
250 idofe = ityp - idofs*10
252 is0 = hecmesh%node_group%grp_index(ig-1) + 1
253 ie0 = hecmesh%node_group%grp_index(ig )
256 in = hecmesh%node_group%grp_item(ik)
258 do idof = idofs, idofe
259 z_k(ndof*(in-1)+idof) = 0.0d0
265 subroutine fstr_apply_alpha0(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, z_k, h_prime, pot)
267 type (hecmwST_local_mesh) :: hecMESH
268 type (hecmwST_matrix) :: hecMAT
269 type (fstr_solid) :: fstrSOLID
270 real(kind=kreal),
intent(in) :: ctime
271 real(kind=kreal),
intent(in) :: tincr
272 integer(kind=kint) :: iter
273 integer,
intent(in) :: cstep
274 real(kind=kreal),
intent(in) :: dtime
275 type (fstr_param) :: fstrPARAM
276 real(kind=kreal),
intent(in) :: z_k(:)
277 real(kind=kreal) :: h_prime, pot
280 call hecmw_innerproduct_r(hecmesh, hecmat%NDOF, hecmat%B, z_k, h_prime)
281 pot = fstr_get_potential(cstep,hecmesh,hecmat,fstrsolid,
pot_type)
284 subroutine fstr_apply_alpha(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, z_k, alpha, h_prime, pot)
286 type (hecmwST_local_mesh) :: hecMESH
287 type (hecmwST_matrix) :: hecMAT
288 type (fstr_solid) :: fstrSOLID
289 real(kind=kreal),
intent(in) :: ctime
290 real(kind=kreal),
intent(in) :: tincr
291 integer(kind=kint) :: iter
292 integer,
intent(in) :: cstep
293 real(kind=kreal),
intent(in) :: dtime
294 type (fstr_param) :: fstrPARAM
295 real(kind=kreal),
intent(in) :: z_k(:)
296 real(kind=kreal),
intent(in) :: alpha
297 real(kind=kreal) :: h_prime, pot
299 hecmat%X(:) = -alpha*z_k(:)
300 call fstr_calc_residual_vector_with_x(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam)
301 call hecmw_innerproduct_r(hecmesh, hecmat%NDOF, hecmat%B, z_k, h_prime)
302 pot = fstr_get_potential_with_x(cstep,hecmesh,hecmat,fstrsolid,
pot_type)
305 subroutine fstr_init_line_search_range(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, z_k, &
306 h_prime_0, pot_0, alpha_S, h_prime_S, pot_S, alpha_E, h_prime_E, pot_E)
308 type (hecmwST_local_mesh) :: hecMESH
309 type (hecmwST_matrix) :: hecMAT
310 type (fstr_solid) :: fstrSOLID
311 real(kind=kreal),
intent(in) :: ctime
312 real(kind=kreal),
intent(in) :: tincr
313 integer(kind=kint) :: iter
314 integer,
intent(in) :: cstep
315 real(kind=kreal),
intent(in) :: dtime
316 type (fstr_param) :: fstrPARAM
317 real(kind=kreal),
intent(in) :: z_k(:)
318 real(kind=kreal),
intent(in) :: h_prime_0, pot_0
319 real(kind=kreal) :: alpha_s, h_prime_s, pot_s
320 real(kind=kreal) :: alpha_e, h_prime_e, pot_e
322 real(kind=kreal) :: alpha_s_new, h_prime_s_new, pot_s_new
323 real(kind=kreal) :: alpha_e_new, h_prime_e_new, pot_e_new
324 real(kind=kreal) :: alpha_tmp, h_prime_tmp, pot_tmp
325 real(kind=kreal) :: z_max
326 real(kind=kreal) :: pot_eps
330 h_prime_s = h_prime_0
334 call hecmw_absmax_r(hecmesh, hecmat%NDOF, z_k, z_max)
339 call fstr_apply_alpha(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, alpha_e, h_prime_e, pot_e)
341 do while (h_prime_e < 0.0d0)
348 call fstr_apply_alpha(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, &
349 & fstrparam, z_k, alpha_e, h_prime_e, pot_e)
370 subroutine fstr_update_range(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, z_k, &
371 alpha_S, h_prime_S, pot_S, alpha_E, h_prime_E, pot_E, alpha_c, h_prime_c, pot_c, h_prime_0, pot_0)
373 type (hecmwST_local_mesh) :: hecMESH
374 type (hecmwST_matrix) :: hecMAT
375 type (fstr_solid) :: fstrSOLID
376 real(kind=kreal),
intent(in) :: ctime
377 real(kind=kreal),
intent(in) :: tincr
378 integer(kind=kint) :: iter
379 integer,
intent(in) :: cstep
380 real(kind=kreal),
intent(in) :: dtime
381 type (fstr_param) :: fstrPARAM
382 real(kind=kreal) :: z_k(:)
383 real(kind=kreal) :: alpha_s, h_prime_s, pot_s
384 real(kind=kreal) :: alpha_e, h_prime_e, pot_e
385 real(kind=kreal) :: alpha_c, h_prime_c, pot_c
386 real(kind=kreal) :: h_prime_0, pot_0
388 real(kind=kreal) :: alpha_a, h_prime_a, pot_a
389 real(kind=kreal) :: alpha_b, h_prime_b, pot_b
390 real(kind=kreal) :: alpha_a_bar, h_prime_a_bar, pot_a_bar
391 real(kind=kreal) :: alpha_b_bar, h_prime_b_bar, pot_b_bar
392 real(kind=kreal) :: alpha_c_bar, h_prime_c_bar, pot_c_bar
394 call fstr_get_new_range_with_potential(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, pot_0, &
395 alpha_s, h_prime_s, pot_s, alpha_e, h_prime_e, pot_e, alpha_c, h_prime_c, pot_c, &
396 alpha_a, h_prime_a, pot_a, alpha_b, h_prime_b, pot_b)
398 if (alpha_c == alpha_a)
then
399 call fstr_get_secant(alpha_s, h_prime_s, alpha_a, h_prime_a, alpha_c_bar)
400 call fstr_apply_alpha(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, &
401 alpha_c_bar, h_prime_c_bar, pot_c_bar)
403 if (alpha_c == alpha_b)
then
404 call fstr_get_secant(alpha_b, h_prime_b, alpha_e, h_prime_e, alpha_c_bar)
405 call fstr_apply_alpha(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, &
406 alpha_c_bar, h_prime_c_bar, pot_c_bar)
409 if ((alpha_c == alpha_a) .or. (alpha_c == alpha_b))
then
410 call fstr_get_new_range_with_potential(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, pot_0, &
411 alpha_a, h_prime_a, pot_a, alpha_b, h_prime_b, pot_b, alpha_c_bar, h_prime_c_bar, pot_c_bar, &
412 alpha_a_bar, h_prime_a_bar, pot_a_bar, alpha_b_bar, h_prime_b_bar, pot_b_bar)
414 alpha_a_bar = alpha_a
415 h_prime_a_bar = h_prime_a
418 alpha_b_bar = alpha_b
419 h_prime_b_bar = h_prime_b
424 if ((alpha_b_bar - alpha_a_bar) > 0.66*(alpha_e - alpha_s))
then
425 alpha_c_bar = 0.5*(alpha_a_bar+alpha_b_bar)
426 call fstr_apply_alpha(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, &
427 alpha_c_bar, h_prime_c_bar, pot_c_bar)
428 call fstr_get_new_range_with_potential(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, pot_0, &
429 alpha_a, h_prime_a, pot_a, alpha_b, h_prime_b, pot_b, alpha_c_bar, h_prime_c_bar, pot_c_bar, &
430 alpha_s, h_prime_s, pot_s, alpha_e, h_prime_e, pot_e)
432 alpha_s = alpha_a_bar
433 h_prime_s = h_prime_a_bar
436 alpha_e = alpha_b_bar
437 h_prime_e = h_prime_b_bar
443 fstrPARAM, z_k, pot_0, alpha_a, h_prime_a, pot_a, alpha_b, h_prime_b, pot_b, alpha_c, h_prime_c, pot_c, &
444 alpha_a_bar, h_prime_a_bar, pot_a_bar, alpha_b_bar, h_prime_b_bar, pot_b_bar)
446 type (hecmwST_local_mesh) :: hecMESH
447 type (hecmwST_matrix) :: hecMAT
448 type (fstr_solid) :: fstrSOLID
449 real(kind=kreal),
intent(in) :: ctime
450 real(kind=kreal),
intent(in) :: tincr
451 integer(kind=kint) :: iter
452 integer,
intent(in) :: cstep
453 real(kind=kreal),
intent(in) :: dtime
454 type (fstr_param) :: fstrPARAM
455 real(kind=kreal),
intent(in) :: z_k(:)
456 real(kind=kreal),
intent(in) :: pot_0
457 real(kind=kreal),
intent(in) :: alpha_a, h_prime_a, pot_a
458 real(kind=kreal),
intent(in) :: alpha_b, h_prime_b, pot_b
459 real(kind=kreal),
intent(in) :: alpha_c, h_prime_c, pot_c
460 real(kind=kreal) :: alpha_a_bar, h_prime_a_bar, pot_a_bar
461 real(kind=kreal) :: alpha_b_bar, h_prime_b_bar, pot_b_bar
463 integer,
parameter :: count_max=100
464 integer :: count_while
465 real(kind=kreal) :: alpha_d, h_prime_d, pot_d
466 real(kind=kreal) :: theta_ls = 0.5d0
467 real(kind=kreal) :: pot_eps
471 if (alpha_c <= alpha_a .or. alpha_b <= alpha_c)
then
472 alpha_a_bar = alpha_a
473 h_prime_a_bar = h_prime_a
476 alpha_b_bar = alpha_b
477 h_prime_b_bar = h_prime_b
482 if (h_prime_c >= 0.0d0)
then
483 alpha_a_bar = alpha_a
484 h_prime_a_bar = h_prime_a
487 alpha_b_bar = alpha_c
488 h_prime_b_bar = h_prime_c
494 if(pot_c <= pot_0 + pot_eps)
then
495 alpha_a_bar = alpha_c
496 h_prime_a_bar = h_prime_c
499 alpha_b_bar = alpha_b
500 h_prime_b_bar = h_prime_b
505 alpha_a_bar = alpha_a
506 h_prime_a_bar = h_prime_a
509 alpha_b_bar = alpha_b
510 h_prime_b_bar = h_prime_b
514 do while(count_while < count_max)
515 count_while = count_while + 1
517 alpha_d = (1.0d0-theta_ls)*alpha_a_bar + theta_ls*alpha_b_bar
518 call fstr_apply_alpha(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, alpha_d, h_prime_d, pot_d)
520 if (h_prime_d >= 0.0d0)
then
521 alpha_b_bar = alpha_d
522 h_prime_b_bar = h_prime_d
527 if(pot_d <= pot_0 + pot_eps)
then
528 alpha_a_bar = alpha_d
529 h_prime_a_bar = h_prime_d
532 alpha_b_bar = alpha_d
533 h_prime_b_bar = h_prime_d
537 write(6,*)
'fstr_get_new_range_with_potential reached loop count max.', hecmesh%my_rank, alpha_a_bar, alpha_b_bar
543 type (hecmwST_local_mesh) :: hecMESH
544 type (hecmwST_matrix) :: hecMAT
545 type (fstr_solid) :: fstrSOLID
546 real(kind=kreal),
intent(in) :: ctime
547 real(kind=kreal),
intent(in) :: tincr
548 integer(kind=kint) :: iter
549 integer,
intent(in) :: cstep
550 real(kind=kreal),
intent(in) :: dtime
551 type (fstr_param) :: fstrPARAM
552 real(kind=kreal) :: z_k(:)
554 real(kind=kreal) :: alpha_s, h_prime_s, pot_s
555 real(kind=kreal) :: alpha_e, h_prime_e, pot_e
556 real(kind=kreal) :: alpha_c, h_prime_c, pot_c
557 real(kind=kreal) :: h_prime_0, pot_0
558 logical :: flag_converged
559 integer :: ndof, len_vector
560 real(kind=kreal) :: res
562 integer(kind=kint) :: i, ierr, iter_ls
563 real(kind=kreal) :: z_max
567 len_vector = hecmesh%n_node*hecmesh%n_dof
569 call fstr_apply_alpha0(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, h_prime_0, pot_0)
570 if (h_prime_0 > 0.0d0)
then
571 write(6,*)
'residual vector is not directed to potential decretion.', h_prime_0
576 fstrparam, z_k, h_prime_0, pot_0, alpha_s, h_prime_s, pot_s, alpha_e, h_prime_e, pot_e)
577 if( hecmesh%my_rank == 0 )
then
578 write(6,
'(a, 6es27.16e3)')
'range initialized: alpha_S, alpha_E, h_prime_S, h_prime_E, pot_S, pot_E', &
579 & alpha_s, alpha_e, h_prime_s, h_prime_e, pot_s, pot_e
585 flag_converged = .false.
589 call fstr_apply_alpha(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, alpha_c, h_prime_c, pot_c)
596 if (flag_converged)
exit
598 call fstr_update_range(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, &
599 alpha_s, h_prime_s, pot_s, alpha_e, h_prime_e, pot_e, alpha_c, h_prime_c, pot_c, h_prime_0, pot_0)
602 if( hecmesh%my_rank == 0 )
then
603 write(6,
'(a, 1i8, 5es27.16e3)')
'converged: alpha_S, alpha_E, alpha_c, h_prime_c, pot_c', &
605 & alpha_s, alpha_e, alpha_c, h_prime_c, pot_c
611 real(kind=kreal),
intent(in) :: a,b, fa,fb
612 real(kind=kreal),
intent(out) :: c
614 c = (a*fb - b*fa) / ( fb - fa )
622 logical :: flag_converged
624 real(kind=kreal),
intent(in) :: alpha_c, h_prime_0, h_prime_c, pot_0, pot_c
625 real(kind=kreal) :: wolfe1_left, wolfe1_right, wolfe2_left, wolfe2_right
627 wolfe1_left = pot_c - pot_0
630 wolfe2_left = h_prime_c
633 flag_converged = (wolfe1_left<=wolfe1_right) .and. (wolfe2_left >= wolfe2_right)
634 if (flag_converged)
write(6,
'(a, 4es27.16e3)')
'oWolfe: ', wolfe1_left, wolfe1_right, wolfe2_left, wolfe2_right
639 logical :: flag_converged
641 real(kind=kreal),
intent(in) :: alpha_c, h_prime_0, h_prime_c, pot_0, pot_c
642 real(kind=kreal) :: wolfe1_left, wolfe1_right, wolfe2_left, wolfe2_right
644 real(kind=kreal) :: pot_eps
647 wolfe1_left = ( 2.0 *
delta_wolfe - 1.0d0 ) * h_prime_0
648 wolfe1_right = h_prime_c
650 wolfe2_left = h_prime_c
654 (wolfe1_left>=wolfe1_right) &
655 .and. (wolfe2_left >= wolfe2_right) &
656 .and. (pot_c <= pot_0 + pot_eps)
657 if (flag_converged)
write(6,
'(a, 6es27.16e3)')
'aWolfe: ', wolfe1_left, wolfe1_right, &
This module provides a unified convergence check for Newton iteration.
subroutine, public fstr_check_convergence(hecMESH, hecMAT, fstrSOLID, fstrPR, ndof, iter, sub_step, cstep, residual_vec, nresid, resb, res_prev, n_node_global, iterStatus, maxDLag, converg_dlag)
Wrapper that calls fstr_check_convergence_main and applies the common divergence/NaN handling (status...
Finite-rotation nodal kinematics for NLGEOM.
subroutine, public fstr_apply_solution_increment(hecMESH, fstrSOLID, ndof, x)
Apply the linear-solver solution increment x to the step displacement dunode.
subroutine, public fstr_commit_solution_increment(hecMESH, fstrSOLID, ndof)
Commit the converged step increment dunode into the total displacement unode.
This module provides functions on nonlinear analysis.
subroutine fstr_init_newton(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, hecLagMAT, ndof, ctAlgo, conMAT)
This module provides functions on nonlinear analysis.
real(kind=kreal), parameter delta_approx_wolfe
real(kind=kreal), parameter psi0_line_search
real(kind=kreal), parameter eps_wolfe
subroutine fstr_get_new_range_with_potential(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, z_k, pot_0, alpha_a, h_prime_a, pot_a, alpha_b, h_prime_b, pot_b, alpha_c, h_prime_c, pot_c, alpha_a_bar, h_prime_a_bar, pot_a_bar, alpha_b_bar, h_prime_b_bar, pot_b_bar)
subroutine fstr_apply_alpha0(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, z_k, h_prime, pot)
real(kind=kreal), parameter c_line_search
subroutine fstr_update_range(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, z_k, alpha_S, h_prime_S, pot_S, alpha_E, h_prime_E, pot_E, alpha_c, h_prime_c, pot_c, h_prime_0, pot_0)
subroutine fstr_calc_direction_lbfgs(hecMESH, g_prev, s_k, y_k, rho_k, z_k, n_mem)
real(kind=kreal), parameter delta_wolfe
subroutine fstr_apply_alpha(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, z_k, alpha, h_prime, pot)
integer, parameter n_mem_max
logical function fstr_wolfe_condition(alpha_c, h_prime_c, pot_c, h_prime_0, pot_0)
integer(kind=kint), parameter maxiter_ls
subroutine fstr_addbc_to_direction_vector(z_k, hecMESH, fstrSOLID, cstep)
subroutine fstr_line_search_along_direction(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, z_k)
subroutine fstr_get_secant(a, Fa, b, Fb, c)
integer(kind=kint), parameter pot_type
subroutine fstr_init_line_search_range(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, z_k, h_prime_0, pot_0, alpha_S, h_prime_S, pot_S, alpha_E, h_prime_E, pot_E)
real(kind=kreal), parameter omega_wolfe
logical function fstr_approx_wolfe_condition(alpha_c, h_prime_c, pot_c, h_prime_0, pot_0)
subroutine fstr_quasi_newton(cstep, hecMESH, hecMAT, fstrSOLID, fstrPARAM, restrt_step_num, sub_step, ctime, dtime)
This subroutine solve nonlinear solid mechanics problems by Newton-Raphson method.
real(kind=kreal), parameter sigma_wolfe