From 0209a1d5a77f6ce1552e3c674685efeedfd8607d Mon Sep 17 00:00:00 2001 From: Pratheek Shanthraj Date: Thu, 28 Feb 2013 17:35:02 +0000 Subject: [PATCH] restructured AL solver to resemble polarization scheme and introduced alpha and beta parameters in numerics to determine what kind of solution you want. alpha = beta = 1 results in the AL scheme. alpha = beta = 2 results in the accelerated scheme. safe values are anything in between. changed the solver to use stress calculations on the campatible field which seems to result in faster convergence. --- code/DAMASK_spectral_solverAL.f90 | 53 +++++++++++++++++-------------- code/numerics.f90 | 20 ++++++++++-- 2 files changed, 47 insertions(+), 26 deletions(-) diff --git a/code/DAMASK_spectral_solverAL.f90 b/code/DAMASK_spectral_solverAL.f90 index d393bf515..885022a38 100644 --- a/code/DAMASK_spectral_solverAL.f90 +++ b/code/DAMASK_spectral_solverAL.f90 @@ -106,7 +106,6 @@ subroutine AL_init(temperature) temperature #include #include - integer(pInt) :: i,j,k real(pReal), dimension(3,3, res(1), res(2),res(3)) :: P real(pReal), dimension(3,3) :: & temp33_Real = 0.0_pReal @@ -376,7 +375,9 @@ end function AL_solution subroutine AL_formResidual(in,x_scal,f_scal,dummy,ierr) use numerics, only: & itmax, & - itmin + itmin, & + polarAlpha, & + polarBeta use math, only: & math_rotate_backward33, & math_transpose33, & @@ -395,7 +396,6 @@ subroutine AL_formResidual(in,x_scal,f_scal,dummy,ierr) implicit none integer(pInt), save :: callNo = 3_pInt - real(pReal), dimension(3,3) :: temp33_Real !-------------------------------------------------------------------------------------------------- ! strange syntax in the next line because otherwise macros expand beyond 132 character limit @@ -451,10 +451,29 @@ subroutine AL_formResidual(in,x_scal,f_scal,dummy,ierr) reportIter = reportIter + 1_pInt endif callNo = callNo +1_pInt + +!-------------------------------------------------------------------------------------------------- +! + field_real = 0.0_pReal + do k = 1_pInt, res(3); do j = 1_pInt, res(2); do i = 1_pInt, res(1) + field_real(i,j,k,1:3,1:3) = math_mul3333xx33(C_scale,(polarAlpha + polarBeta)*F(1:3,1:3,i,j,k) - & + (polarAlpha)*F_lambda(1:3,1:3,i,j,k)) + enddo; enddo; enddo + +!-------------------------------------------------------------------------------------------------- +! doing convolution in Fourier space + call Utilities_FFTforward() + call Utilities_fourierConvolution(math_rotate_backward33(polarBeta*F_aim,params%rotation_BC)) + call Utilities_FFTbackward() + +!-------------------------------------------------------------------------------------------------- +! constructing residual + residual_F_lambda = polarBeta*F - reshape(field_real(1:res(1),1:res(2),1:res(3),1:3,1:3),& + [3,3,res(1),res(2),res(3)],order=[3,4,5,1,2]) !-------------------------------------------------------------------------------------------------- ! evaluate constitutive response - call Utilities_constitutiveResponse(F_lastInc,F,params%temperature,params%timeinc, & + call Utilities_constitutiveResponse(F_lastInc,F - residual_F_lambda/polarBeta,params%temperature,params%timeinc, & residual_F,C,P_av,ForwardData,params%rotation_BC) ForwardData = .False. @@ -462,31 +481,19 @@ subroutine AL_formResidual(in,x_scal,f_scal,dummy,ierr) ! stress BC handling F_aim = F_aim - math_mul3333xx33(S, ((P_av - params%P_BC))) ! S = 0.0 for no bc err_stress = maxval(abs(mask_stress * (P_av - params%P_BC))) ! mask = 0.0 for no bc - + !-------------------------------------------------------------------------------------------------- -! - field_real = 0.0_pReal +! constructing residual do k = 1_pInt, res(3); do j = 1_pInt, res(2); do i = 1_pInt, res(1) - temp33_Real = math_mul3333xx33(S_scale,residual_F(1:3,1:3,i,j,k)) + math_I3 - residual_F(1:3,1:3,i,j,k) = temp33_Real - field_real(i,j,k,1:3,1:3) = -math_mul3333xx33(C_scale,F_lambda(1:3,1:3,i,j,k)-F(1:3,1:3,i,j,k)) + residual_F(1:3,1:3,i,j,k) = math_mul3333xx33(S_scale,residual_F(1:3,1:3,i,j,k)) - & + F_lambda(1:3,1:3,i,j,k) + & + F(1:3,1:3,i,j,k) + & + residual_F_lambda(1:3,1:3,i,j,k) enddo; enddo; enddo -!-------------------------------------------------------------------------------------------------- -! doing convolution in Fourier space - call Utilities_FFTforward() - call Utilities_fourierConvolution(math_rotate_backward33(F_aim,params%rotation_BC)) - call Utilities_FFTbackward() - -!-------------------------------------------------------------------------------------------------- -! constructing residual - residual_F_lambda = F - reshape(field_real(1:res(1),1:res(2),1:res(3),1:3,1:3),& - [3,3,res(1),res(2),res(3)],order=[3,4,5,1,2]) - residual_F = residual_F - F_lambda + residual_F_lambda - !-------------------------------------------------------------------------------------------------- ! calculating errors - err_f = wgt*sqrt(sum(residual_F_lambda**2.0_pReal)) + err_f = wgt*sqrt(sum(residual_F_lambda**2.0_pReal))/polarBeta err_p = wgt*sqrt(sum((residual_F - residual_F_lambda)**2.0_pReal)) end subroutine AL_formResidual diff --git a/code/numerics.f90 b/code/numerics.f90 index 3a3aba694..177efd996 100644 --- a/code/numerics.f90 +++ b/code/numerics.f90 @@ -92,7 +92,9 @@ module numerics err_f_tol = 1e-6_pReal, & err_p_tol = 1e-5_pReal, & fftw_timelimit = -1.0_pReal, & !< sets the timelimit of plan creation for FFTW, see manual on www.fftw.org, Default -1.0: disable timelimit - rotation_tol = 1.0e-12_pReal !< tolerance of rotation specified in loadcase, Default 1.0e-12: first guess + rotation_tol = 1.0e-12_pReal, & !< tolerance of rotation specified in loadcase, Default 1.0e-12: first guess + polarAlpha = 1.0_pReal, & !< polarization scheme parameter 0.0 < alpha < 2.0. alpha = 1.0 ==> AL scheme, alpha = 2.0 ==> accelerated scheme + polarBeta = 1.0_pReal !< polarization scheme parameter 0.0 < beta < 2.0. beta = 1.0 ==> AL scheme, beta = 2.0 ==> accelerated scheme character(len=64), private :: & fftw_plan_mode = 'FFTW_PATIENT' !< reads the planing-rigor flag, see manual on www.fftw.org, Default FFTW_PATIENT: use patient planner flag character(len=64), protected, public :: & @@ -305,9 +307,14 @@ subroutine numerics_init err_f_tol = IO_floatValue(line,positions,2_pInt) case ('err_p_tol') err_p_tol = IO_floatValue(line,positions,2_pInt) + case ('polaralpha') + polarAlpha = IO_floatValue(line,positions,2_pInt) + case ('polarbeta') + polarBeta = IO_floatValue(line,positions,2_pInt) #endif #ifndef PETSc - case ('myspectralsolver', 'petsc_options','err_f_tol', 'err_p_tol') ! found PETSc parameter, but compiled without PETSc + case ('myspectralsolver', 'petsc_options','err_f_tol', 'err_p_tol', & + 'polaralpha','polarBeta') ! found PETSc parameter, but compiled without PETSc call IO_warning(41_pInt,ext_msg=tag) #endif #endif @@ -315,7 +322,7 @@ subroutine numerics_init case ('err_div_tol','err_stress_tolrel','err_stress_tolabs',& ! found spectral parameter for FEM build 'itmax', 'itmin','memory_efficient','fftw_timelimit','fftw_plan_mode','myspectralsolver', & 'rotation_tol','divergence_correction','update_gamma','petsc_options','myfilter', & - 'err_f_tol', 'err_p_tol', 'maxcutback') + 'err_f_tol', 'err_p_tol', 'maxcutback','polaralpha','polarbeta') call IO_warning(40_pInt,ext_msg=tag) #endif case default ! found unknown keyword @@ -425,6 +432,8 @@ subroutine numerics_init #ifdef PETSc write(6,'(a24,1x,es8.1)') ' err_f_tol: ',err_f_tol write(6,'(a24,1x,es8.1)') ' err_p_tol: ',err_p_tol + write(6,'(a24,1x,es8.1)') ' polarAlpha: ',polarAlpha + write(6,'(a24,1x,es8.1)') ' polarBeta: ',polarBeta write(6,'(a24,1x,a)') ' myspectralsolver: ',trim(myspectralsolver) write(6,'(a24,1x,a)') ' PETSc_options: ',trim(petsc_options) #endif @@ -484,6 +493,11 @@ subroutine numerics_init #ifdef PETSc if (err_f_tol <= 0.0_pReal) call IO_error(301_pInt,ext_msg='err_f_tol') if (err_p_tol <= 0.0_pReal) call IO_error(301_pInt,ext_msg='err_p_tol') + if (polarAlpha <= 0.0_pReal .or. & + polarAlpha > 2.0_pReal) call IO_error(301_pInt,ext_msg='polarAlpha') + if (polarBeta <= 0.0_pReal .or. & + polarBeta > 2.0_pReal) call IO_error(301_pInt,ext_msg='polarBeta') + if (err_p_tol <= 0.0_pReal) call IO_error(301_pInt,ext_msg='err_p_tol') #endif #endif if (fixedSeed <= 0_pInt) &