inverse of fBase_evalDOF_IP_tens
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(t_fBase), | intent(in) | :: | sf |
self |
||
| logical, | intent(in) | :: | add |
=F initialize DOFs , =T add to DOFs |
||
| real(kind=wp), | intent(in) | :: | factor |
scale result by factor, before adding to DOFs (should be =1.0_wp if not needed) |
||
| integer, | intent(in) | :: | deriv |
=0: base, =2: dthet , =3: dzeta |
||
| real(kind=wp), | intent(in) | :: | y_IP(:) |
point values (at sf%x_IP if x_IP_in not given) |
||
| real(kind=wp), | intent(inout) | :: | DOFs(1:sf%modes) |
array of all modes |
SUBROUTINE fBase_projectIPtoDOF_tens(sf,add,factor,deriv,y_IP,DOFs) ! MODULES IMPLICIT NONE ! INPUT VARIABLES -------------------------! CLASS(t_fBase), INTENT(IN ) :: sf !! self LOGICAL , INTENT(IN ) :: add !! =F initialize DOFs , =T add to DOFs REAL(wp) , INTENT(IN ) :: factor !! scale result by factor, before adding to DOFs (should be =1.0_wp if not needed) INTEGER , INTENT(IN ) :: deriv !! =0: base, =2: dthet , =3: dzeta REAL(wp) , INTENT(IN ) :: y_IP(:) !! point values (at sf%x_IP if x_IP_in not given) ! OUTPUT VARIABLES -------------------------! REAL(wp) , INTENT(INOUT) :: DOFs(1:sf%modes) !! array of all modes ! LOCAL VARIABLES -------------------------! INTEGER :: iMode,offset,mTotal,nTotal REAL(wp) :: Amn(1:sf%mTotal1D,-sf%mn_max(2):sf%mn_max(2)) REAL(wp) :: Ctmp(1:sf%mn_nyq(1),1:2,-sf%mn_max(2):sf%mn_max(2)) ! CODE --------------------------------------------------------------------------------------------------------------------------! IF(SIZE(y_IP,1).NE.sf%mn_IP) CALL abort(__STAMP__, & 'y_IP not correct when calling fBase_projectIPtoDOF_tens' ) mTotal= sf%mTotal1D nTotal=2*sf%mn_max(2)+1 !-n_max:n_nax SELECT CASE(deriv) CASE(0) ! DO n=-sf%mn_max(2),sf%mn_max(2) ! DO i=1,sf%mn_nyq(1) ! Ctmp(i,1,n)=SUM(sf%base1D_IPthet(i,1,:)*Amn(:,n)) ! Ctmp(i,2,n)=SUM(sf%base1D_IPthet(i,2,:)*Amn(:,n)) ! END DO !i ! END DO !n ! k=0 ! DO j=1,sf%mn_nyq(2) ! DO i=1,sf%mn_nyq(1) ! k=k+1 ! y_IP(k)=SUM(Ctmp(i,1:2,:)*sf%base1D_IPzeta(1:2,:,j)) ! END DO !i ! END DO !j __DGEMM_NT(Ctmp, sf%mn_nyq(1),sf%mn_nyq(2),y_IP, 2*nTotal,sf%mn_nyq(2),sf%base1D_IPzeta) __ADGEMM_TN(Amn,factor, 2*sf%mn_nyq(1),mTotal,sf%base1D_IPthet, 2*sf%mn_nyq(1),nTotal,Ctmp) CASE(DERIV_THET) __DGEMM_NT(Ctmp, sf%mn_nyq(1),sf%mn_nyq(2),y_IP, 2*nTotal,sf%mn_nyq(2),sf%base1D_IPzeta) __ADGEMM_TN(Amn,factor, 2*sf%mn_nyq(1),mTotal,sf%base1D_dthet_IPthet, 2*sf%mn_nyq(1),nTotal,Ctmp) CASE(DERIV_ZETA) __DGEMM_NT(Ctmp, sf%mn_nyq(1),sf%mn_nyq(2),y_IP, 2*nTotal,sf%mn_nyq(2),sf%base1D_dzeta_IPzeta) __ADGEMM_TN(Amn,factor, 2*sf%mn_nyq(1),mTotal,sf%base1D_IPthet, 2*sf%mn_nyq(1),nTotal,Ctmp) CASE DEFAULT CALL abort(__STAMP__, & "fbase_evalDOF_IP_tens: derivative must be 0,DERIV_THET,DERIV_ZETA!") END SELECT offset=sf%mTotal1D-(sf%mn_max(1)+1) !=0 if sin or cos, =sf%mn_max(1)+1 if sin+cos !copy modes back IF(add)THEN DO iMode=sf%sin_range(1)+1,sf%sin_range(2) DOFs(iMode)=DOFs(iMode)+Amn(1+sf%Xmn(1,iMode),sf%Xmn(2,iMode)/sf%nfp) END DO DO iMode=sf%cos_range(1)+1,sf%cos_range(2) DOFs(iMode)=DOFs(iMode)+Amn(offset+1+sf%Xmn(1,iMode),sf%Xmn(2,iMode)/sf%nfp) END DO ELSE DO iMode=sf%sin_range(1)+1,sf%sin_range(2) DOFs(iMode)=Amn(1+sf%Xmn(1,iMode),sf%Xmn(2,iMode)/sf%nfp) END DO DO iMode=sf%cos_range(1)+1,sf%cos_range(2) DOFs(iMode)=Amn(offset+1+sf%Xmn(1,iMode),sf%Xmn(2,iMode)/sf%nfp) END DO END IF !add END SUBROUTINE fBase_projectIPtoDOF_tens