diff --git a/src/python/OpenFUSIONToolkit/TokaMaker/_core.py b/src/python/OpenFUSIONToolkit/TokaMaker/_core.py index d9b29bf7..f0cd8f90 100644 --- a/src/python/OpenFUSIONToolkit/TokaMaker/_core.py +++ b/src/python/OpenFUSIONToolkit/TokaMaker/_core.py @@ -11,6 +11,7 @@ ''' import collections import ctypes +from os import walk import numpy from ._interface import * @@ -1808,7 +1809,7 @@ def save_mug(self,filename): if error_string.value != b'': raise Exception(error_string.value) - def set_coil_current_dist(self,coil_name,curr_dist): + def set_coil_current_dist(self,coil_name,curr_dist,normalize=False): '''! Overwrite coil with non-uniform current distribution. @param coil_name Name of coil to modify @@ -1822,7 +1823,7 @@ def set_coil_current_dist(self,coil_name,curr_dist): self.dist_coils[iCoil] = curr_dist curr_dist = numpy.ascontiguousarray(curr_dist, dtype=numpy.float64) error_string = self._oft_env.get_c_errorbuff() - tokamaker_set_coil_current_dist(self._tMaker_ptr,c_int(iCoil+1),curr_dist,error_string) + tokamaker_set_coil_current_dist(self._tMaker_ptr,c_int(iCoil+1),curr_dist,c_bool(normalize),error_string) if error_string.value != b'': raise Exception(error_string.value) diff --git a/src/python/OpenFUSIONToolkit/TokaMaker/_interface.py b/src/python/OpenFUSIONToolkit/TokaMaker/_interface.py index 267e09c1..44fe67d7 100644 --- a/src/python/OpenFUSIONToolkit/TokaMaker/_interface.py +++ b/src/python/OpenFUSIONToolkit/TokaMaker/_interface.py @@ -238,7 +238,7 @@ class tokamaker_settings_struct(c_struct): # tokamaker_set_coil_current_dist(tMaker_ptr,iCoil,curr_dist,error_str) tokamaker_set_coil_current_dist = ctypes_subroutine(oftpy_lib.tokamaker_set_coil_current_dist, - [c_void_p, c_int, ctypes_numpy_array(numpy.float64,1), c_char_p]) + [c_void_p, c_int, ctypes_numpy_array(numpy.float64,1), c_bool, c_char_p]) ## @endcond diff --git a/src/python/wrappers/tokamaker_f.F90 b/src/python/wrappers/tokamaker_f.F90 index c454c3e1..43bb2e95 100644 --- a/src/python/wrappers/tokamaker_f.F90 +++ b/src/python/wrappers/tokamaker_f.F90 @@ -1453,10 +1453,11 @@ END SUBROUTINE tokamaker_save_mug !--------------------------------------------------------------------------- !> Overwrites default coil flux contribution to non-uniform current distribution !------------------------------------------------------------------------------ -SUBROUTINE tokamaker_set_coil_current_dist(tMaker_ptr,iCoil,curr_dist,error_str) BIND(C,NAME="tokamaker_set_coil_current_dist") +SUBROUTINE tokamaker_set_coil_current_dist(tMaker_ptr,iCoil,curr_dist,normalize,error_str) BIND(C,NAME="tokamaker_set_coil_current_dist") TYPE(c_ptr), VALUE, INTENT(in) :: tMaker_ptr !< TokaMaker instance INTEGER(c_int), VALUE, INTENT(in) :: iCoil TYPE(c_ptr), VALUE, INTENT(in) :: curr_dist +LOGICAL(c_bool), VALUE, INTENT(in) :: normalize CHARACTER(KIND=c_char), INTENT(out) :: error_str(OFT_ERROR_SLEN) !< Error string (empty if no error) REAL(8), POINTER, DIMENSION(:) :: vals_tmp INTEGER(4) :: i @@ -1470,6 +1471,9 @@ SUBROUTINE tokamaker_set_coil_current_dist(tMaker_ptr,iCoil,curr_dist,error_str) call tMaker_obj%gs%psi%new(tmp_vec) CALL gs_coil_source_distributed(tMaker_obj%gs,iCoil,tmp_vec,vals_tmp) +IF (normalize) THEN + CALL tmp_vec%scale(1.0/tmp_vec%sum()) +END IF CALL tMaker_obj%gs%zerob_bc%apply(tmp_vec) CALL gs_vacuum_solve(tMaker_obj%gs,tMaker_obj%gs%psi_coil(iCoil)%f,tmp_vec)