29 sub_step, ctime, dtime )
32 integer,
intent(in) :: cstep
33 type (hecmwST_local_mesh) :: hecMESH
34 type (hecmwST_matrix) :: hecMAT
35 type (fstr_solid) :: fstrSOLID
36 integer,
intent(in) :: sub_step
37 real(kind=kreal),
intent(in) :: ctime
38 real(kind=kreal),
intent(in) :: dtime
39 type (fstr_param) :: fstrPARAM
40 type (hecmwST_matrix_lagrange) :: hecLagMAT
42 type (hecmwST_local_mesh),
pointer :: hecMESHmpc
43 type (hecmwST_matrix),
pointer :: hecMATmpc
44 type (hecmwST_ebc) :: hecEBC
45 integer(kind=kint) :: ndof
46 integer(kind=kint) :: i, iter
47 integer(kind=kint) :: stepcnt
48 real(kind=kreal) :: tincr
49 logical :: isLinear = .false.
50 integer(kind=kint) :: iterStatus
51 type(fstr_convergence_state) :: cnvstat
53 real(kind=kreal),
allocatable :: z_k(:), s_k(:,:), y_k(:,:), g_prev(:), rho_k(:)
54 real(kind=kreal) :: sdoty
57 integer(kind=kint) :: k
59 integer :: max_iter_bak
60 logical :: flag_approx_Wolfe
62 max_iter_bak = fstrsolid%step_ctrl(cstep)%max_iter
63 fstrsolid%step_ctrl(cstep)%max_iter = 100*fstrsolid%step_ctrl(cstep)%max_iter
65 call hecmw_mpc_mat_init(hecmesh, hecmat, hecmeshmpc, hecmatmpc)
67 if(.not. fstrparam%nlgeom)
then
71 hecmat%NDOF = hecmesh%n_dof
77 if( fstrsolid%step_ctrl(cstep)%solution == stepstatic ) tincr = 0.d0
78 call fstr_init_newton(hecmesh, hecmat, fstrsolid, ctime, tincr, cstep, dtime, fstrparam, heclagmat, ndof, 0, hecmat)
79 fstrsolid%GL0(:) = fstrsolid%GL(:)
83 call fstr_addbc(cstep, hecmesh, hecmat, fstrsolid, fstrparam, heclagmat, 1, hecebc, rhsvector=fstrsolid%dunode)
85 call fstr_calc_residual_vector(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam)
87 len_vector = hecmesh%n_node*ndof
88 allocate(z_k(len_vector))
91 allocate(g_prev(len_vector))
99 y_k(i,1) = -hecmat%B(i)
105 flag_approx_wolfe = .false.
108 do iter=1,fstrsolid%step_ctrl(cstep)%max_iter
112 do i=1,hecmesh%n_node*ndof
113 g_prev(i) = -hecmat%B(i)
119 if( hecebc%mark(i) /= 0 ) z_k(i) = 0.0d0
132 call fstr_calc_residual_vector(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam)
136 hecmat%B, cnvstat, iterstatus)
137 if (iterstatus == kitrconverged)
exit
138 if (iterstatus == kitrdiverged .or. iterstatus==kitrfloatingerror)
then
140 call hecmw_mpc_mat_finalize(hecmesh, hecmat, hecmeshmpc, hecmatmpc)
141 fstrsolid%step_ctrl(cstep)%max_iter = max_iter_bak
149 s_k(:,k) = s_k(:,k-1)
150 y_k(:,k) = y_k(:,k-1)
151 rho_k(k) = rho_k(k-1)
154 do i = 1, hecmesh%n_node*ndof
155 s_k(i,1) = hecmat%X(i)
156 y_k(i,1) = -hecmat%B(i) - g_prev(i)
158 call hecmw_innerproduct_r(hecmesh,ndof,s_k(:,1), y_k(:,1), sdoty)
159 if (abs(sdoty) < 1.0d-10)
then
162 rho_k(1) = 1.0d0/sdoty
167 fstrsolid%NRstat_i(knstmaxit) = max(fstrsolid%NRstat_i(knstmaxit),iter)
168 fstrsolid%NRstat_i(knstsumit) = fstrsolid%NRstat_i(knstsumit) + iter
174 call fstr_updatestate( hecmesh, fstrsolid, tincr )
176 fstrsolid%CutBack_stat = 0
178 call hecmw_mpc_mat_finalize(hecmesh, hecmat, hecmeshmpc, hecmatmpc)
180 fstrsolid%step_ctrl(cstep)%max_iter = max_iter_bak
186 type (hecmwST_local_mesh) :: hecMESH
187 real(kind=kreal) :: z_k(:), s_k(:,:), y_k(:,:), g_prev(:), rho_k(:)
190 real(kind=kreal),
allocatable :: q(:)
191 real(kind=kreal) :: alpha(n_mem), beta
192 real(kind=kreal) :: sdotq, ysq, gamma, ydotz, g_max
194 integer :: len_vector, ndof
195 integer(kind=kint) :: k,i
198 len_vector = hecmesh%n_node*hecmesh%n_dof
199 allocate(q(len_vector))
201 q(1:len_vector) = g_prev(1:len_vector)
204 call hecmw_innerproduct_r(hecmesh,ndof,s_k(:,k), q, sdotq)
205 alpha(k) = rho_k(k) * sdotq
207 q(i) = q(i) - alpha(k)*y_k(i,k)
210 call hecmw_innerproduct_r(hecmesh,ndof,y_k(:,1), y_k(:,1), ysq)
212 call hecmw_absmax_r(hecmesh, ndof, g_prev, g_max)
219 else if (abs(rho_k(1)) < 1.0d-10)
then
222 gamma = 1.0d0/(rho_k(1)*ysq)
230 call hecmw_innerproduct_r(hecmesh,ndof,y_k(:,k), z_k, ydotz)
231 beta = rho_k(k)*ydotz
233 z_k(i)=z_k(i) + s_k(i,k)*(alpha(k)-beta)
241 type (hecmwST_local_mesh) :: hecMESH
242 type (hecmwST_matrix) :: hecMAT
243 type (fstr_solid) :: fstrSOLID
244 integer,
intent(in) :: cstep
245 real(kind=kreal),
intent(in) :: z_k(:)
246 real(kind=kreal) :: h_prime, pot
249 call hecmw_innerproduct_r(hecmesh, hecmat%NDOF, hecmat%B, z_k, h_prime)
250 pot = fstr_get_potential(cstep,hecmesh,hecmat,fstrsolid,
pot_type)
253 subroutine fstr_apply_alpha(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, z_k, alpha, h_prime, pot)
255 type (hecmwST_local_mesh) :: hecMESH
256 type (hecmwST_matrix) :: hecMAT
257 type (fstr_solid) :: fstrSOLID
258 real(kind=kreal),
intent(in) :: ctime
259 real(kind=kreal),
intent(in) :: tincr
260 integer(kind=kint) :: iter
261 integer,
intent(in) :: cstep
262 real(kind=kreal),
intent(in) :: dtime
263 type (fstr_param) :: fstrPARAM
264 real(kind=kreal),
intent(in) :: z_k(:)
265 real(kind=kreal),
intent(in) :: alpha
266 real(kind=kreal) :: h_prime, pot
268 hecmat%X(:) = -alpha*z_k(:)
269 call fstr_calc_residual_vector_with_x(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam)
270 call hecmw_innerproduct_r(hecmesh, hecmat%NDOF, hecmat%B, z_k, h_prime)
271 pot = fstr_get_potential_with_x(cstep,hecmesh,hecmat,fstrsolid,
pot_type)
274 subroutine fstr_init_line_search_range(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, z_k, &
275 h_prime_0, pot_0, alpha_S, h_prime_S, pot_S, alpha_E, h_prime_E, pot_E)
277 type (hecmwST_local_mesh) :: hecMESH
278 type (hecmwST_matrix) :: hecMAT
279 type (fstr_solid) :: fstrSOLID
280 real(kind=kreal),
intent(in) :: ctime
281 real(kind=kreal),
intent(in) :: tincr
282 integer(kind=kint) :: iter
283 integer,
intent(in) :: cstep
284 real(kind=kreal),
intent(in) :: dtime
285 type (fstr_param) :: fstrPARAM
286 real(kind=kreal),
intent(in) :: z_k(:)
287 real(kind=kreal),
intent(in) :: h_prime_0, pot_0
288 real(kind=kreal) :: alpha_s, h_prime_s, pot_s
289 real(kind=kreal) :: alpha_e, h_prime_e, pot_e
291 real(kind=kreal) :: z_max
292 real(kind=kreal) :: pot_eps
296 h_prime_s = h_prime_0
300 call hecmw_absmax_r(hecmesh, hecmat%NDOF, z_k, z_max)
305 call fstr_apply_alpha(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, alpha_e, h_prime_e, pot_e)
307 do while (h_prime_e < 0.0d0)
309 call fstr_apply_alpha(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, &
310 & fstrparam, z_k, alpha_e, h_prime_e, pot_e)
314 subroutine fstr_update_range(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, z_k, &
315 alpha_S, h_prime_S, pot_S, alpha_E, h_prime_E, pot_E, alpha_c, h_prime_c, pot_c, pot_0)
317 type (hecmwST_local_mesh) :: hecMESH
318 type (hecmwST_matrix) :: hecMAT
319 type (fstr_solid) :: fstrSOLID
320 real(kind=kreal),
intent(in) :: ctime
321 real(kind=kreal),
intent(in) :: tincr
322 integer(kind=kint) :: iter
323 integer,
intent(in) :: cstep
324 real(kind=kreal),
intent(in) :: dtime
325 type (fstr_param) :: fstrPARAM
326 real(kind=kreal) :: z_k(:)
327 real(kind=kreal) :: alpha_s, h_prime_s, pot_s
328 real(kind=kreal) :: alpha_e, h_prime_e, pot_e
329 real(kind=kreal) :: alpha_c, h_prime_c, pot_c
330 real(kind=kreal) :: pot_0
332 real(kind=kreal) :: alpha_a, h_prime_a, pot_a
333 real(kind=kreal) :: alpha_b, h_prime_b, pot_b
334 real(kind=kreal) :: alpha_a_bar, h_prime_a_bar, pot_a_bar
335 real(kind=kreal) :: alpha_b_bar, h_prime_b_bar, pot_b_bar
336 real(kind=kreal) :: alpha_c_bar, h_prime_c_bar, pot_c_bar
338 call fstr_get_new_range_with_potential(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, pot_0, &
339 alpha_s, h_prime_s, pot_s, alpha_e, h_prime_e, pot_e, alpha_c, h_prime_c, pot_c, &
340 alpha_a, h_prime_a, pot_a, alpha_b, h_prime_b, pot_b)
342 if (alpha_c == alpha_a)
then
343 call fstr_get_secant(alpha_s, h_prime_s, alpha_a, h_prime_a, alpha_c_bar)
344 call fstr_apply_alpha(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, &
345 alpha_c_bar, h_prime_c_bar, pot_c_bar)
347 if (alpha_c == alpha_b)
then
348 call fstr_get_secant(alpha_b, h_prime_b, alpha_e, h_prime_e, alpha_c_bar)
349 call fstr_apply_alpha(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, &
350 alpha_c_bar, h_prime_c_bar, pot_c_bar)
353 if ((alpha_c == alpha_a) .or. (alpha_c == alpha_b))
then
354 call fstr_get_new_range_with_potential(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, pot_0, &
355 alpha_a, h_prime_a, pot_a, alpha_b, h_prime_b, pot_b, alpha_c_bar, h_prime_c_bar, pot_c_bar, &
356 alpha_a_bar, h_prime_a_bar, pot_a_bar, alpha_b_bar, h_prime_b_bar, pot_b_bar)
358 alpha_a_bar = alpha_a
359 h_prime_a_bar = h_prime_a
362 alpha_b_bar = alpha_b
363 h_prime_b_bar = h_prime_b
368 if ((alpha_b_bar - alpha_a_bar) > 0.66*(alpha_e - alpha_s))
then
369 alpha_c_bar = 0.5*(alpha_a_bar+alpha_b_bar)
370 call fstr_apply_alpha(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, &
371 alpha_c_bar, h_prime_c_bar, pot_c_bar)
372 call fstr_get_new_range_with_potential(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, pot_0, &
373 alpha_a, h_prime_a, pot_a, alpha_b, h_prime_b, pot_b, alpha_c_bar, h_prime_c_bar, pot_c_bar, &
374 alpha_s, h_prime_s, pot_s, alpha_e, h_prime_e, pot_e)
376 alpha_s = alpha_a_bar
377 h_prime_s = h_prime_a_bar
380 alpha_e = alpha_b_bar
381 h_prime_e = h_prime_b_bar
387 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, &
388 alpha_a_bar, h_prime_a_bar, pot_a_bar, alpha_b_bar, h_prime_b_bar, pot_b_bar)
390 type (hecmwST_local_mesh) :: hecMESH
391 type (hecmwST_matrix) :: hecMAT
392 type (fstr_solid) :: fstrSOLID
393 real(kind=kreal),
intent(in) :: ctime
394 real(kind=kreal),
intent(in) :: tincr
395 integer(kind=kint) :: iter
396 integer,
intent(in) :: cstep
397 real(kind=kreal),
intent(in) :: dtime
398 type (fstr_param) :: fstrPARAM
399 real(kind=kreal),
intent(in) :: z_k(:)
400 real(kind=kreal),
intent(in) :: pot_0
401 real(kind=kreal),
intent(in) :: alpha_a, h_prime_a, pot_a
402 real(kind=kreal),
intent(in) :: alpha_b, h_prime_b, pot_b
403 real(kind=kreal),
intent(in) :: alpha_c, h_prime_c, pot_c
404 real(kind=kreal) :: alpha_a_bar, h_prime_a_bar, pot_a_bar
405 real(kind=kreal) :: alpha_b_bar, h_prime_b_bar, pot_b_bar
407 integer,
parameter :: count_max=100
408 integer :: count_while
409 real(kind=kreal) :: alpha_d, h_prime_d, pot_d
410 real(kind=kreal) :: theta_ls = 0.5d0
411 real(kind=kreal) :: pot_eps
415 if (alpha_c <= alpha_a .or. alpha_b <= alpha_c)
then
416 alpha_a_bar = alpha_a
417 h_prime_a_bar = h_prime_a
420 alpha_b_bar = alpha_b
421 h_prime_b_bar = h_prime_b
426 if (h_prime_c >= 0.0d0)
then
427 alpha_a_bar = alpha_a
428 h_prime_a_bar = h_prime_a
431 alpha_b_bar = alpha_c
432 h_prime_b_bar = h_prime_c
438 if(pot_c <= pot_0 + pot_eps)
then
439 alpha_a_bar = alpha_c
440 h_prime_a_bar = h_prime_c
443 alpha_b_bar = alpha_b
444 h_prime_b_bar = h_prime_b
449 alpha_a_bar = alpha_a
450 h_prime_a_bar = h_prime_a
453 alpha_b_bar = alpha_b
454 h_prime_b_bar = h_prime_b
458 do while(count_while < count_max)
459 count_while = count_while + 1
461 alpha_d = (1.0d0-theta_ls)*alpha_a_bar + theta_ls*alpha_b_bar
462 call fstr_apply_alpha(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, alpha_d, h_prime_d, pot_d)
464 if (h_prime_d >= 0.0d0)
then
465 alpha_b_bar = alpha_d
466 h_prime_b_bar = h_prime_d
471 if(pot_d <= pot_0 + pot_eps)
then
472 alpha_a_bar = alpha_d
473 h_prime_a_bar = h_prime_d
476 alpha_b_bar = alpha_d
477 h_prime_b_bar = h_prime_d
481 write(6,*)
'fstr_get_new_range_with_potential reached loop count max.', hecmesh%my_rank, alpha_a_bar, alpha_b_bar
487 type (hecmwST_local_mesh) :: hecMESH
488 type (hecmwST_matrix) :: hecMAT
489 type (fstr_solid) :: fstrSOLID
490 real(kind=kreal),
intent(in) :: ctime
491 real(kind=kreal),
intent(in) :: tincr
492 integer(kind=kint) :: iter
493 integer,
intent(in) :: cstep
494 real(kind=kreal),
intent(in) :: dtime
495 type (fstr_param) :: fstrPARAM
496 real(kind=kreal) :: z_k(:)
498 real(kind=kreal) :: alpha_s, h_prime_s, pot_s
499 real(kind=kreal) :: alpha_e, h_prime_e, pot_e
500 real(kind=kreal) :: alpha_c, h_prime_c, pot_c
501 real(kind=kreal) :: h_prime_0, pot_0
502 logical :: flag_converged
503 integer :: ndof, len_vector
505 integer(kind=kint) :: iter_ls
508 len_vector = hecmesh%n_node*hecmesh%n_dof
511 if (h_prime_0 > 0.0d0)
then
512 write(6,*)
'residual vector is not directed to potential decretion.', h_prime_0
517 fstrparam, z_k, h_prime_0, pot_0, alpha_s, h_prime_s, pot_s, alpha_e, h_prime_e, pot_e)
518 if( hecmesh%my_rank == 0 )
then
519 write(6,
'(a, 6es27.16e3)')
'range initialized: alpha_S, alpha_E, h_prime_S, h_prime_E, pot_S, pot_E', &
520 & alpha_s, alpha_e, h_prime_s, h_prime_e, pot_s, pot_e
526 flag_converged = .false.
530 call fstr_apply_alpha(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, alpha_c, h_prime_c, pot_c)
537 if (flag_converged)
exit
539 call fstr_update_range(hecmesh, hecmat, fstrsolid, ctime, tincr, iter, cstep, dtime, fstrparam, z_k, &
540 alpha_s, h_prime_s, pot_s, alpha_e, h_prime_e, pot_e, alpha_c, h_prime_c, pot_c, pot_0)
543 if( hecmesh%my_rank == 0 )
then
544 write(6,
'(a, 1i8, 5es27.16e3)')
'converged: alpha_S, alpha_E, alpha_c, h_prime_c, pot_c', &
546 & alpha_s, alpha_e, alpha_c, h_prime_c, pot_c
552 real(kind=kreal),
intent(in) :: a,b, fa,fb
553 real(kind=kreal),
intent(out) :: c
555 c = (a*fb - b*fa) / ( fb - fa )
563 logical :: flag_converged
565 real(kind=kreal),
intent(in) :: alpha_c, h_prime_0, h_prime_c, pot_0, pot_c
566 real(kind=kreal) :: wolfe1_left, wolfe1_right, wolfe2_left, wolfe2_right
568 wolfe1_left = pot_c - pot_0
571 wolfe2_left = h_prime_c
574 flag_converged = (wolfe1_left<=wolfe1_right) .and. (wolfe2_left >= wolfe2_right)
575 if (flag_converged)
write(6,
'(a, 4es27.16e3)')
'oWolfe: ', wolfe1_left, wolfe1_right, wolfe2_left, wolfe2_right
580 logical :: flag_converged
582 real(kind=kreal),
intent(in) :: h_prime_0, h_prime_c, pot_0, pot_c
583 real(kind=kreal) :: wolfe1_left, wolfe1_right, wolfe2_left, wolfe2_right
585 real(kind=kreal) :: pot_eps
588 wolfe1_left = ( 2.0 *
delta_wolfe - 1.0d0 ) * h_prime_0
589 wolfe1_right = h_prime_c
591 wolfe2_left = h_prime_c
595 (wolfe1_left>=wolfe1_right) &
596 .and. (wolfe2_left >= wolfe2_right) &
597 .and. (pot_c <= pot_0 + pot_eps)
598 if (flag_converged)
write(6,
'(a, 6es27.16e3)')
'aWolfe: ', wolfe1_left, wolfe1_right, &
Essential boundary conditions kept as per-DOF marks and values so that they can be imposed on the mat...
subroutine, public hecmw_ebc_init(hecMAT, hecEBC)
subroutine, public hecmw_ebc_finalize(hecEBC)
This module provides a unified convergence check for Newton iteration.
subroutine, public fstr_check_convergence(hecMESH, hecMAT, fstrSOLID, fstrPARAM, ndof, iter, sub_step, cstep, residual_vec, cnvstat, iterStatus, hecLagMAT)
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, 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
logical function fstr_approx_wolfe_condition(h_prime_c, pot_c, h_prime_0, pot_0)
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)
real(kind=kreal), parameter c_line_search
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_line_search_along_direction(hecMESH, hecMAT, fstrSOLID, ctime, tincr, iter, cstep, dtime, fstrPARAM, z_k)
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, pot_0)
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
subroutine fstr_apply_alpha0(hecMESH, hecMAT, fstrSOLID, cstep, z_k, h_prime, pot)
real(kind=kreal), parameter sigma_wolfe
subroutine fstr_quasi_newton(cstep, hecMESH, hecMAT, fstrSOLID, fstrPARAM, sub_step, ctime, dtime)
This subroutine solve nonlinear solid mechanics problems by Newton-Raphson method.