change data from old_sBase to self. using interpolations of the old data at the new interpolation points
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(t_sBase), | intent(in) | :: | sf |
self |
||
| class(c_sbase), | intent(in) | :: | old_sBase |
base of old_data |
||
| integer, | intent(in) | :: | iterDim |
iterate on first or second dimension or old_data/sf_data |
||
| real(kind=wp), | intent(in) | :: | old_data(:,:) | |||
| real(kind=wp), | intent(out) | :: | sf_data(:,:) |
SUBROUTINE sBase_change_base( sf,old_sBase,iterDim,old_data,sf_data) ! MODULES IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES CLASS(t_sBase), INTENT(IN ) :: sf !! self CLASS(c_sBase), INTENT(IN ) :: old_sBase !! base of old_data INTEGER ,INTENT(IN ) :: iterDim !! iterate on first or second dimension or old_data/sf_data REAL(wp) ,INTENT(IN ) :: old_data(:,:) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL(wp) ,INTENT( OUT) :: sf_data(:,:) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES LOGICAL :: sameBase INTEGER :: iIP,iter,iterSize REAL(wp),ALLOCATABLE :: eval_old_sbase(:,:),gIP(:,:) INTEGER ,ALLOCATABLE :: Elem_old_sbase(:) !=================================================================================================================================== SELECT TYPE(old_sBase); CLASS IS(t_sBase) IF(.NOT.old_sBase%initialized) THEN CALL abort(__STAMP__, & "sBase_chamge_base: tried to change base with non-initialized sBase!") END IF IF((iterDim.LT.1).OR.(iterDim.GT.2))THEN CALL abort(__STAMP__, & "sBase_chamge_base: iterDim can only be 1 or 2!") END IF iterSize=SIZE(old_data,iterDim) IF(iterSize.NE.SIZE(sf_data,iterDim)) THEN CALL abort(__STAMP__, & "sBase_chamge_base: iteration dimenion of old_data and sf_data have to be the same!") END IF IF(SIZE(old_data,3-iterDim).NE.old_sBase%nbase) THEN CALL abort(__STAMP__, & "sBase_chamge_base: old_data size does not match old_sBase!") END IF IF(SIZE( sf_data,3-iterDim).NE. sf%nbase) THEN CALL abort(__STAMP__, & "sBase_chamge_base: sf_data size does not match sf sBase!") END IF CALL sf%compare(old_sBase,is_same=sameBase) IF(sameBase)THEN !same base sf_data=old_data ELSE !actually change base ALLOCATE(Elem_old_sbase(1:sf%nBase),eval_old_sbase(0:old_sbase%deg,1:sf%nBase)) ALLOCATE(gIP(1:sf%nBase,iterSize)) DO iIP=1,sf%nBase CALL old_sbase%eval(sf%S_IP(iIP),0,Elem_old_sbase(iIP),eval_old_sbase(:,iIP)) END DO SELECT CASE(iterDim) CASE(1) DO iIP=1,sf%nBase DO iter=1,iterSize gIP(iIP,iter)=old_sbase%evalDOF_base(Elem_old_sbase(iIP),eval_old_sbase(:,iIP),old_data(iter,:)) END DO END DO DO iter=1,iterSize sf_data(iter,:)=sf%initDOF(gIP(:,iter)) END DO CASE(2) DO iIP=1,sf%nBase DO iter=1,iterSize gIP(iIP,iter)=old_sbase%evalDOF_base(Elem_old_sbase(iIP),eval_old_sbase(:,iIP),old_data(:,iter)) END DO END DO DO iter=1,iterSize sf_data(:,iter)=sf%initDOF(gIP(:,iter)) END DO END SELECT !iterDim DEALLOCATE(Elem_old_sBase,eval_old_sbase,gIP) END IF !same base END SELECT !TYPE END SUBROUTINE sBase_change_base