write_modes.F90 Source File

!!matvec with matmul !#define __MATVEC_N(y,Mat,Vec) y=MATMUL(Mat,Vec) !#define __MATVEC_T(y,Mat,Vec) y=MATMUL(Vec,Mat) !#define __PMATVEC_N(fy,y,Mat,Vec) y=fyy+MATMUL(Mat,Vec) !#define __PMATVEC_T(fy,y,Mat,Vec) y=fyy+MATMUL(Vec,Mat) !#define __AMATVEC_N(y,fMat,Mat,Vec) y=fMatMATMUL(Mat,Vec) !#define __AMATVEC_T(y,fMat,Mat,Vec) y=fMatMATMUL(Vec,Mat) !#define __PAMATVEC_N(fy,y,fMat,Mat,Vec) y=fyy+fMatMATMUL(Mat,Vec) !#define __PAMATVEC_T(fy,y,fMat,Mat,Vec) y=fyy+fMatMATMUL(Vec,Mat)

!!#define __GENERICMATVEC(NT,fy,y,fMat,Mat,Vec) CALL DGEMV(NT,SIZE(Mat,1),SIZE(Mat,2),fMat,Mat,SIZE(Mat,1),Vec,1,fy,y,1)

!!matmat with matmul !#define __MATMAT_NN(Y,A,B) Y=MATMUL(A,B) !#define __MATMAT_TN(Y,A,B) Y=MATMUL(TRANSPOSE(A),B) !#define __MATMAT_NT(Y,A,B) Y=MATMUL(A,TRANSPOSE(B)) !#define __MATMAT_TT(Y,A,B) Y=TRANSPOSE(MATMUL(B,A))

!#define __PMATMAT_NN(fy,Y,A,B) Y=fyY+MATMUL(A,B) !#define __PMATMAT_TN(fy,Y,A,B) Y=fyY+MATMUL(TRANSPOSE(A),B) !#define __PMATMAT_NT(fy,Y,A,B) Y=fyY+MATMUL(A,TRANSPOSE(B)) !#define __PMATMAT_TT(fy,Y,A,B) Y=fyY+TRANSPOSE(MATMUL(B,A))

!#define __AMATMAT_NN(Y,fa,A,B) Y=faMATMUL(A,B) !#define __AMATMAT_TN(Y,fa,A,B) Y=faMATMUL(TRANSPOSE(A),B) !#define __AMATMAT_NT(Y,fa,A,B) Y=faMATMUL(A,TRANSPOSE(B)) !#define __AMATMAT_TT(Y,fa,A,B) Y=faTRANSPOSE(MATMUL(B,A))

!#define __PAMATMAT_NN(fy,Y,fa,A,B) Y=fyY+faMATMUL(A,B) !#define __PAMATMAT_TN(fy,Y,fa,A,B) Y=fyY+faMATMUL(TRANSPOSE(A),B) !#define __PAMATMAT_NT(fy,Y,fa,A,B) Y=fyY+faMATMUL(A,TRANSPOSE(B)) !#define __PAMATMAT_TT(fy,Y,fa,A,B) Y=fyY+faTRANSPOSE(MATMUL(B,A))

! GEMM does in general Y = fa A^?B^? + fy Y ! with structure: (m x n) = (m x k) (k x n) ! Y=A B : DGEMM('N','N',m,n,k,fa,Amat ,m, Bmat,k, fy,Y,m) ! Y=A^TB : DGEMM('T','N',m,n,k,fa,Amat ,k, Bmat,k, fy,Y,m) ! Y=A B^T : DGEMM('N','T',m,n,k,fa,Amat ,m, Bmat,n, fy,Y,m) ! Y=A^T*B^T : DGEMM('T','T',m,n,k,fa,Amat ,k, Bmat,n, fy,Y,m)

!#define __GENERICMATMAT_NN(fy,Y,fa,A,B) CALL DGEMM('N','N',SIZE(A,1),SIZE(B,2),SIZE(B,1),fa,A,SIZE(A,1),B,SIZE(B,1),fy,Y,SIZE(A,1)) !#define __GENERICMATMAT_TN(fy,Y,fa,A,B) CALL DGEMM('T','N',SIZE(A,2),SIZE(B,2),SIZE(B,1),fa,A,SIZE(B,1),B,SIZE(B,1),fy,Y,SIZE(A,2)) !#define __GENERICMATMAT_NT(fy,Y,fa,A,B) CALL DGEMM('N','T',SIZE(A,1),SIZE(B,1),SIZE(B,2),fa,A,SIZE(A,1),B,SIZE(B,1),fy,Y,SIZE(A,1)) !#define __GENERICMATMAT_TT(fy,Y,fa,A,B) CALL DGEMM('T','T',SIZE(A,2),SIZE(B,1),SIZE(B,2),fa,A,SIZE(B,2),B,SIZE(B,1),fy,Y,SIZE(A,2))

! SIMPLE INTERFACE FOR DGEMM, specifying nrows/ncols of mat A and nrows/ncols of mat B (for any transpose!) ! GEMM does in general Y = fa A^?B^? + fy Y ! with structure: (m x n) = (m x k) (k x n) ! Y=A B : DGEMM('N','N',m,n,k,fa,Amat ,m, Bmat,k, fy,Y,m) ! Y=A^TB : DGEMM('T','N',m,n,k,fa,Amat ,k, Bmat,k, fy,Y,m) ! Y=A B^T : DGEMM('N','T',m,n,k,fa,Amat ,m, Bmat,n, fy,Y,m) ! Y=A^T*B^T : DGEMM('T','T',m,n,k,fa,Amat ,k, Bmat,n, fy,Y,m)


This file depends on

sourcefile~~write_modes.f90~~EfferentGraph sourcefile~write_modes.f90 write_modes.F90 sourcefile~globals.f90 globals.F90 sourcefile~write_modes.f90->sourcefile~globals.f90 sourcefile~output_csv.f90 output_csv.F90 sourcefile~write_modes.f90->sourcefile~output_csv.f90 sourcefile~output_csv.f90->sourcefile~globals.f90

Files dependent on this one

sourcefile~~write_modes.f90~~AfferentGraph sourcefile~write_modes.f90 write_modes.F90 sourcefile~analyze.f90 analyze.F90 sourcefile~analyze.f90->sourcefile~write_modes.f90 sourcefile~gvec_post.f90 gvec_post.F90 sourcefile~gvec_post.f90->sourcefile~analyze.f90 sourcefile~mhd3d.f90 mhd3d.F90 sourcefile~gvec_post.f90->sourcefile~mhd3d.f90 sourcefile~mhd3d.f90->sourcefile~analyze.f90 sourcefile~mhd3d_minimize.f90 mhd3d_minimize.F90 sourcefile~mhd3d.f90->sourcefile~mhd3d_minimize.f90 sourcefile~mhd3d_minimize.f90->sourcefile~analyze.f90 sourcefile~run.f90 run.F90 sourcefile~run.f90->sourcefile~analyze.f90 sourcefile~rungvec.f90 rungvec.F90 sourcefile~run.f90->sourcefile~rungvec.f90 sourcefile~rungvec.f90->sourcefile~analyze.f90 sourcefile~rungvec.f90->sourcefile~mhd3d.f90 sourcefile~state.f90 state.F90 sourcefile~state.f90->sourcefile~analyze.f90 sourcefile~state.f90->sourcefile~mhd3d.f90 sourcefile~gvec.f90 gvec.F90 sourcefile~gvec.f90->sourcefile~rungvec.f90

Source Code

!===================================================================================================================================
! Copyright (c) 2025 GVEC Contributors, Max Planck Institute for Plasma Physics
! License: MIT
!===================================================================================================================================
#include "defines.FPP"

!===================================================================================================================================
!>
!!# Module **write_modes**
!!
!! Analyze and output equilibrium data
!!
!===================================================================================================================================
MODULE MODgvec_write_modes
! MODULES
USE MODgvec_Globals, ONLY:wp,abort
IMPLICIT NONE
PRIVATE

INTERFACE write_modes
  MODULE PROCEDURE write_modes
END INTERFACE

PUBLIC::write_modes
!===================================================================================================================================

CONTAINS

!===================================================================================================================================
!> write modes prepared above
!!
!===================================================================================================================================
SUBROUTINE write_modes(fname,vname,nval,modes,xm,xn,coord,rho_first,values_in,VarNames_in)
! MODULES
USE MODgvec_Output_CSV, ONLY:WriteDataToCSV
IMPLICIT NONE
!-----------------------------------------------------------------------------------------------------------------------------------
! INPUT VARIABLES
  CHARACTER(LEN=*),INTENT(IN)   :: fname
  CHARACTER(LEN=*),INTENT(IN)   :: vname
  INTEGER         ,INTENT(IN)   :: modes
  INTEGER         ,INTENT(IN)   :: xm(1:modes)
  INTEGER         ,INTENT(IN)   :: xn(1:modes)
  REAL(wp),INTENT(IN)           :: coord(:)
  REAL(wp),INTENT(IN)           :: rho_first
  REAL(wp),INTENT(INOUT)        :: values_in(:,:)
  CHARACTER(LEN=*),INTENT(INOUT):: VarNames_in(:)
!-----------------------------------------------------------------------------------------------------------------------------------
! OUTPUT VARIABLES
  INTEGER         ,INTENT(INOUT):: nval
!-----------------------------------------------------------------------------------------------------------------------------------
! LOCAL VARIABLES
  INTEGER                    :: i,iMode
  REAL(wp)                   :: minmaxval(2)
  REAL(wp) ,ALLOCATABLE      :: max_loc_val(:)
  CHARACTER(LEN=100),ALLOCATABLE :: varnames_max(:)
!===================================================================================================================================

  minmaxval(1)=MINVAL(values_in(nVal-modes:nVal,:))
  minmaxval(2)=MAXVAL(values_in(nVal-modes:nVal,:))

!  DO iMode=1,modes
!    nVal=nVal+1
!    WRITE(VarNames_in(nVal),'(A)')TRIM(VarNames_in(nVal-modes))//'_norm'
!    values_in(nVal,:)=values_in(nVal-modes,:)/(MAXVAL(ABS(values_in(nVal-modes,:)))+1.0E-12)
!  END DO

!  nVal=nVal+2
!  Varnames_in(nVal-1)=TRIM(vname)//', m= odd, n= 000'
!  Varnames_in(nVal)=  TRIM(vname)//', m=even, n= 000'
!  values_in(nVal-1:nVal,:)=0.
!  DO iMode=1,modes
!    IF((xn(iMode)).EQ.0)THEN
!      IF(MOD((xm(iMode)),2).NE.0)THEN
!        values_in(nVal-1,:)= values_in(nVal-1,:)+values_in(nVal-2-2*modes+iMode,:)
!      ELSE
!        values_in(nVal,:)= values_in(nVal,:)+values_in(nVal-2-2*modes+iMode,:)
!      END IF
!    END IF !n=0
!  END DO

  CALL WriteDataToCSV(VarNames_in(1:nVal),Values_in(1:nVal,:), TRIM(fname))

!  ALLOCATE(max_loc_val(nVal),Varnames_max(nVal))
!  DO i=1,nVal
!    max_loc_val(i)=coord(MAXLOC(ABS(values_in(i,:)),1))
!    Varnames_max(i)=TRIM(VarNames_in(i))//'_maxloc'
!  END DO
!  CALL WriteDataToCSV(VarNames_max(:) ,RESHAPE(max_loc_val(:),(/nval,1/)) &
!                             ,TRIM(fname) &
!                             ,append_in=.TRUE.,vfmt_in='E15.5')
!  DO i=1,nVal
!    max_loc_val(i)=      MAXVAL(ABS(values_in(i,:)))+1.0E-12
!    Varnames_max(i)=TRIM(VarNames_in(i))//'_maxval'
!  END DO
!  CALL WriteDataToCSV(VarNames_max(:) ,RESHAPE(max_loc_val(:),(/nval,1/)) &
!                             ,TRIM(fname) &
!                             ,append_in=.TRUE.,vfmt_in='E15.5')
!  DEALLOCATE(max_loc_val,Varnames_max)
!  !write position of first flux surface
!  CALL WriteDataToCSV((/'rhoFirst'/) ,RESHAPE((/rho_First/),(/1,1/)) &
!                             ,TRIM(fname) &
!                             ,append_in=.TRUE.)
!  !write position of first flux surface
!  CALL WriteDataToCSV((/'minval_total','maxval_total'/) ,RESHAPE(minmaxval,(/2,1/)) &
!                             ,TRIM(fname) &
!                             ,append_in=.TRUE.)

END SUBROUTINE write_modes


END MODULE MODgvec_write_modes