From badc90d63f72e9a1ca2dec2149520006ff32acd9 Mon Sep 17 00:00:00 2001 From: Matthieu Jacobs <matthieu.jacobs@student.kuleuven.be> Date: Wed, 2 Mar 2022 15:49:30 +0100 Subject: [PATCH] add gbdrifts --- Scripts_Matthieu/AnalysisFunctions.py | 75 +++++++++++----- Scripts_Matthieu/AnalyzeNumericalResults.py | 97 ++++++++++++++------- 2 files changed, 118 insertions(+), 54 deletions(-) diff --git a/Scripts_Matthieu/AnalysisFunctions.py b/Scripts_Matthieu/AnalysisFunctions.py index 748766a..b1a25f0 100644 --- a/Scripts_Matthieu/AnalysisFunctions.py +++ b/Scripts_Matthieu/AnalysisFunctions.py @@ -4,35 +4,51 @@ import Constants import math import Utilities -def extractValues(positions, drifts, efield, edescr, bdescr, ExB): +def extractValues(positions, drifts, efield, gradb, drgradb, edescr, bdescr, gradbdescr, ExB, gradBdrift): pos = [] enum = [] - dnum = [] + denum = [] + gnum = [] + dgnum = [] enumperp = [] - dnumperp = [] + denumperp = [] + gnumperp = [] + dgnumperp = [] ea = [] ba = [] - da = [] + dea = [] + dga = [] + ga = [] + for i in range(len(drifts)): # Convert to float values to allow computations and interpretation - dn = [float(x) for x in drifts[i].split()] + den = [float(x) for x in drifts[i].split()] dpn = [float(x) for x in positions[i].split()] en = [float(x) for x in efield[i].split()] + gbn = [float(x) for x in gradb[i].split()] + dbn = [float(x) for x in drgradb[i].split()] # filter our boundary cells => These have zero field and drift and are not useful for interpretation! if dn != [0,0,0] and not math.isnan(dn[0]): - dnum.append(dn) + denum.append(dn) pos.append(dpn) enum.append(en) + gnum.append(gbn) + dgnum.append(dbn) # Compute analytical efield and drifts at these positions efa = edescr(dpn[0], dpn[2], dpn[1], Constants.Rmajor) bfa = bdescr(dpn[0], dpn[2], dpn[1], Constants.Rmajor, Constants.Rminor) + gfa = gradbdescr(dpn[0], dpn[2], dpn[1], Constants.Rmajor, Constants.Rminor) + dga.append(gradBdrift(bga,gfa).tolist()) + ga.append(gfa) ea.append(efa) - ba.append(ba) - da.append(ExB(efa, bfa).tolist()) - dnumperp.append(transformCyltoRadPerp(dnum[i],pos[i])) - enumperp.append(transformCyltoRadPerp(enum[i],pos[i])) - return [pos, enum, dnum, enumperp,dnumperp, ea , ba, da] + ba.append(bfa) + dea.append(ExB(efa, bfa).tolist()) + denumperp.append(transformCyltoRadPerp(denum[-1],pos[-1])) + enumperp.append(transformCyltoRadPerp(enum[-1],pos[-1])) + gnumperp.append(transformCyltoRadPerp(gnum[-1],pos[-1])) + dgnumperp.append(transformCyltoRadPerp(dgnum[-1],pos[-1])) + return [pos, enum, denum,gnum,dgnum, enumperp,denumperp, gnumperp ,dgnumperp,ea , ba, dea, ga,dga] def extractVectorInfo(numeric,analytical): res_mag = [] @@ -46,8 +62,8 @@ def extractVectorInfo(numeric,analytical): an_mag.append(math.sqrt(sum([x**2 for x in analytical[i]]))) er_mag.append(math.sqrt((res_mag[i]-an_mag[i])**2)) er_vec.append(Utilities.listdif(numeric[i],analytical[i])) - er_rel_vec.append([math.sqrt(x**2)/an_mag[i] for x in er_vec[i]]) - er_rel_mag.append(er_mag[i]/an_mag[i]) + er_rel_vec.append([math.sqrt(x**2)/max(1,an_mag[i]) for x in er_vec[i]]) + er_rel_mag.append(er_mag[i]/max(1,an_mag[i])) return [res_mag,an_mag,er_mag,er_vec,er_rel_mag,er_rel_vec] @@ -76,21 +92,26 @@ def getAllSlices(positions,allInfo,direction,coordinate): result.append(pos_slice) return result -def getAllInfo(positions,drifts,efield,edescr,bdescr,ExB): - [pos, enum, dnum,enumperp,dnumperp, ea, ba, da] = extractValues(positions, drifts, efield, edescr, bdescr, ExB) +def getAllInfo(positions,drifts,efield, gradb, drgradb,edescr,bdescr, gradbdescr, ExB, gradBdrift): + [pos, enum, denum,gnum,dgnum, enumperp,denumperp, gnumperp ,dgnumperp,ea , ba, dea, ga,dga] = + extractValues(positions, drifts, efield, gradb, drgradb, edescr, bdescr,gradbdescr, ExB, gradBdrift) - [dres_mag, dan_mag, der_mag, der_vec, der_rel_mag, der_rel_vec] = extractVectorInfo(dnum,da) + [deres_mag, dean_mag, deer_mag, deer_vec, deer_rel_mag, deer_rel_vec] = extractVectorInfo(denum,dea) [eres_mag, ean_mag, eer_mag, eer_vec, eer_rel_mag, eer_rel_vec] = extractVectorInfo(enum, ea) + [gres_mag, gan_mag, ger_mag, ger_vec, ger_rel_mag, ger_rel_vec] = extractVectorInfo(gnum, ga) + [dgres_mag, dgan_mag, dger_mag, dger_vec, dger_rel_mag, dger_rel_vec] = extractVectorInfo(dgnum, dga) torsurf = pos[0][1] torSliceDict = {} - keys = ['drifts', 'efield','drifts_perp','efield_perp' 'ef_mag', 'ef_an_mag', 'drift_mag', 'drift_an_mag', 'ef_vec_er', 'ef_mag_er', - 'drift_vec_er', 'drift_er_mag', - 'efield_er_rel_mag', 'efield_er_rel_vec', 'drift_er_rel_mag', 'drift_er_rel_vec', 'pos'] + keys = ['edrifts', 'efield','edrifts_perp','efield_perp' ,'ef_mag', 'ef_an_mag', 'edrift_mag', 'edrift_an_mag', 'ef_vec_er', 'ef_mag_er', + 'edrift_vec_er', 'edrift_er_mag','efield_er_rel_mag', 'efield_er_rel_vec', 'edrift_er_rel_mag', 'edrift_er_rel_vec', + 'gdrifts', 'gradb','gdrifts_perp','gradb_perp', 'gb_mag','gb_an_mag', 'gdrift_mag','gdrift_an_mag','gb_vec_er', 'gb_mag_er', + 'gdrift_vec_er','gdrift_er_mag','gb_er_rel_mag','gb_er_rel_vec','gdrift_er_rel_mag', 'gb_er_rel_vec', 'pos'] #torslices = getAllSlices(pos,[dres_mag, dan_mag, der_mag, der_vec, der_rel_mag, der_rel_vec,eres_mag, ean_mag, eer_mag, eer_vec, eer_rel_mag, eer_rel_vec],1,torsurf) - values = [dnum,enum,dnumperp,enumperp,eres_mag,ean_mag,dres_mag,dan_mag,eer_vec,eer_mag,der_vec,der_mag,eer_rel_mag,eer_rel_vec,der_rel_mag,der_rel_vec,pos] + values = [denum,enum,denumperp,enumperp,eres_mag,ean_mag,deres_mag,dean_mag,eer_vec,eer_mag,deer_vec,der_mag,eer_rel_mag,eer_rel_vec,deer_rel_mag,deer_rel_vec, + dgnum,enum,dgnumperp,enumperp,eres_mag,ean_mag,dgres_mag,dgan_mag,eer_vec,eer_mag,dger_vec,dgr_mag,eer_rel_mag,eer_rel_vec,dger_rel_mag,dger_rel_vec,pos] for i in range(len(values)): torSliceDict[keys[i]] = values[i] @@ -106,10 +127,16 @@ def readText(filepath): def transformCyltoRadPerp(v,pos): - result = v - phi = math.atan2(pos[2],pos[0]) - result[0] = v[0]*math.cos(phi)+v[2]*math.sin(phi) - result[2] = v[2]*math.cos(phi)-v[0]*math.sin(phi) + result = [] + phi = math.atan2(pos[2],pos[0]-500) + c = math.cos(phi) + s = math.sin(phi) + result.append(abs(v[0]*c+v[2]*s)) + result.append(v[1]) + result.append(abs(v[2]*c-v[0]*s)) +# print('phi',phi,s,c) + # print('v',v) + # print('res',result) return result diff --git a/Scripts_Matthieu/AnalyzeNumericalResults.py b/Scripts_Matthieu/AnalyzeNumericalResults.py index ffc89d0..1742b0c 100644 --- a/Scripts_Matthieu/AnalyzeNumericalResults.py +++ b/Scripts_Matthieu/AnalyzeNumericalResults.py @@ -9,16 +9,24 @@ import PlottingFunctions import AnalysisFunctions # Constants -drifts_file = open('/u/mbj/Drifts/data-for-drift-computations/Description1/Case50/OutputGG/ExB_RESULTS','r') -driftpos_file = open('/u/mbj/Drifts/data-for-drift-computations/Description1/Case50/OutputGG/DRIFT_POS','r') -efield_file = open('/u/mbj/Drifts/data-for-drift-computations/Description1/Case50/OutputGG/EFIELD','r') -drifts = [] -drift_pos = [] +path = '/u/mbj/Drifts/data-for-drift-computations/Description2/Case50/OutputGG/' +edrifts_file = open(path+'ExB_RESULTS','r') +driftpos_file = open(path+'DRIFT_POS','r') +efield_file = open(path+'EFIELD','r') +gradb_file = open(path+'GRADB', 'r') +gdrifts_file = open(path+'GRADB_DRIFTS', 'r') +edrifts = [] +edrift_pos = [] efield = [] +gradb = [] +gdrifts = [] # Read numeric drift values -for line in drifts_file: - drifts.append(line) +for line in edrifts_file: + edrifts.append(line) + +for line in gdrifts_file: + gdrifts.append(line) # Read drift positions for line in driftpos_file: @@ -26,32 +34,48 @@ for line in driftpos_file: # Electric field for line in efield_file: - efield.append(line) + efield.append(line) + +# GradB +for line in gradb_file: + gradb.append(line) # Convert values from fortran to float, filter boundary cells and compute analytical profiles for cell center locations -[drift_pos_num, efield_num, drifts_num, efield_an, bfield_an, drifts_an] = AnalysisFunctions.extractValues(drift_pos,drifts, efield,AnalyticalPrescriptions.e_descr1,AnalyticalPrescriptions.b_field_description1,driftFunctions.ExBdrift) +[pos, enum, denum,gnum,dgnum, enumperp,denumperp, gnumperp ,dgnumperp,ea , ba, dea, ga,dga] = AnalysisFunctions.extractValues(drift_pos,drifts, efield,AnalyticalPrescriptions.e_descr3,AnalyticalPrescriptions.b_field_description1,driftFunctions.ExBdrift) # Compute vectors and magnitude + errors for efield and drift -[drift_res_mag,drift_an_mag,drift_er_mag,drift_er_vec,drift_er_rel_mag,drift_er_rel_vec] = AnalysisFunctions.extractVectorInfo(drifts_num,drifts_an) -[efield_res_mag,efield_an_mag,efield_er_mag,efield_er_vec,efield_er_rel_mag,efield_er_rel_vec] = AnalysisFunctions.extractVectorInfo(efield_num,efield_an) +[edrift_res_mag,edrift_an_mag,edrift_er_mag,edrift_er_vec,edrift_er_rel_mag,edrift_er_rel_vec] = AnalysisFunctions.extractVectorInfo(denum,dea) +[efield_res_mag,efield_an_mag,efield_er_mag,efield_er_vec,efield_er_rel_mag,efield_er_rel_vec] = AnalysisFunctions.extractVectorInfo(enum,ea) +[gdrift_res_mag,gdrift_an_mag,gdrift_er_mag,gdrift_er_vec,gdrift_er_rel_mag,gdrift_er_rel_vec] = AnalysisFunctions.extractVectorInfo(dgnum,dga) +[gradb_res_mag,gradb_an_mag,gradb_er_mag,gradb_er_vec,gradb_er_rel_mag,gradb_er_rel_vec] = AnalysisFunctions.extractVectorInfo(gnum,ga) + # Take slices in different directions to allow for extra analysis +#print(drift_pos_num) torsurf = drift_pos_num[0][1] radsurf = drift_pos_num[150][0] # Based on inspection # Create a dictionary containing the different slices torSliceDict = {} -keys = ['drifts','efield','drifts_perp','efield_perp','ef_mag','ef_an_mag','drift_mag','drift_an_mag','ef_vec_er','ef_mag_er','drift_vec_er','drift_er_mag', - 'efield_er_rel_mag','efield_er_rel_vec','drift_er_rel_mag','drift_er_rel_vec','pos'] -torslices = AnalysisFunctions.getAllSlices(drift_pos_num,[drifts_num,efield_num,efield_res_mag,efield_an_mag,drift_res_mag, - drift_an_mag,efield_er_vec,efield_er_mag,drift_er_vec,drift_er_mag,efield_er_rel_mag, - efield_er_rel_vec,drift_er_rel_mag,drift_er_rel_vec],1,torsurf) +keys = ['edrifts', 'efield','edrifts_perp','efield_perp' ,'ef_mag', 'ef_an_mag', 'edrift_mag', 'edrift_an_mag', 'ef_vec_er', 'ef_mag_er', + 'edrift_vec_er', 'edrift_er_mag','efield_er_rel_mag', 'efield_er_rel_vec', 'edrift_er_rel_mag', 'edrift_er_rel_vec', + 'gdrifts', 'gradb','gdrifts_perp','gradb_perp', 'gb_mag','gb_an_mag', 'gdrift_mag','gdrift_an_mag','gb_vec_er', 'gb_mag_er', + 'gdrift_vec_er','gdrift_er_mag','gb_er_rel_mag','gb_er_rel_vec','gdrift_er_rel_mag', 'gb_er_rel_vec', 'pos'] +allInfo = [enum, denum,gnum,dgnum, enumperp,denumperp, gnumperp ,dgnumperp,ea , ba, dea, ga,dga, + edrift_res_mag,edrift_an_mag,edrift_er_mag,edrift_er_vec,edrift_er_rel_mag,edrift_er_rel_vec, + efield_res_mag,efield_an_mag,efield_er_mag,efield_er_vec,efield_er_rel_mag,efield_er_rel_vec, + gdrift_res_mag,gdrift_an_mag,gdrift_er_mag,gdrift_er_vec,gdrift_er_rel_mag,gdrift_er_rel_vec, + gradb_res_mag,gradb_an_mag,gradb_er_mag,gradb_er_vec,gradb_er_rel_mag,gradb_er_rel_vec] + +torslices = AnalysisFunctions.getAllSlices(pos,allInfo,1,torsurf) for i in range(len(torslices)): torSliceDict[keys[i]] = torslices[i] +print(torSliceDict.get('ef_mag')) +print(torSliceDict.get('ef_an_mag')) print(torSliceDict.get('efield_er_rel_mag')) -print(sum(torSliceDict.get('efield_er_rel_mag'))) -print(len(torSliceDict.get('efield_er_rel_mag'))) +print('max',max(torSliceDict.get('efield_er_rel_mag'))) +#print(len(torSliceDict.get('efield_er_rel_mag'))) # Plot results x = [r[0] for r in torSliceDict.get('pos')] @@ -63,64 +87,77 @@ ez = [x[1] for x in torSliceDict.get('efield')] plot1 = plt.figure(1) plt.xlabel('Radial Position [cm]') plt.ylabel('Vertical Position [cm]') -plt.title('Magnitude of Electic Field') +title = 'Magnitude of Electic Field' +plt.title(title) sc1 = plt.scatter(x, y, s=20, c=torSliceDict.get('ef_mag'), cmap='plasma') plt.colorbar(sc1) - +plt.savefig(path+title+'.png') plot2 = plt.figure(2) plt.xlabel('Radial Position [cm]') plt.ylabel('Vertical Position [cm]') -plt.title('Theta component of Electric Field') +title = 'Theta component of Electric Field' +plt.title(title) sc2 = plt.scatter(x, y, s=20, c = [x[1] for x in torSliceDict.get('efield')], cmap='plasma') plt.colorbar(sc2) +plt.savefig(path+title+'.png') plot3 = plt.figure(3) plt.xlabel('Radial Position [cm]') plt.ylabel('Vertical Position [cm]') -plt.title('Relative magnitude error of Electric Field') +title = 'Relative magnitude error of Electric Field' +plt.title(title) sc3 = plt.scatter(x, y, s=20, c=torSliceDict.get('efield_er_rel_mag'), cmap='plasma') plt.colorbar(sc3) +plt.savefig(path+title+'.png') plot4 = plt.figure(4) plt.title('Potential') PlottingFunctions.plot2DContour(Constants.ns,Constants.ns,Constants.Rmajor-Constants.Rminor,Constants.Rmajor+Constants.Rminor,-Constants.Rminor,Constants.Rminor,Constants.Rmajor,Constants.Rminor,AnalyticalPrescriptions.potential_description1,'X [cm]', 'Y [cm]','Potential [V]',False) +plt.savefig(path+title+'.png') plot5 = plt.figure(5) plt.xlabel('Radial Position [cm]') plt.ylabel('Vertical Position [cm]') -plt.title('Magnitude of ExB Drift (Numerical)') +title = 'Magnitude of ExB Drift (Numerical)' +plt.title(title) sc5 = plt.scatter(x, y, s=20, c=torSliceDict.get('drift_mag'), cmap='plasma') plt.colorbar(sc5) +plt.savefig(path+title+'.png') + plot6 = plt.figure(6) plt.xlabel('Radial Position [cm]') plt.ylabel('Vertical Position [cm]') -plt.title('Magnitude of ExB Drift (Analytical)') +title = 'Magnitude of ExB Drift (Analytical)' +plt.title(title) sc6 = plt.scatter(x, y, s=20, c=torSliceDict.get('drift_an_mag'), cmap='plasma') plt.colorbar(sc6) +plt.savefig(path+title+'.png') + plot7 = plt.figure(7) plt.xlabel('Radial Position [cm]') plt.ylabel('Vertical Position [cm]') -plt.title('Relative magnitude error of ExB Drift') +title = 'Relative magnitude error of ExB Drift' +plt.title(title) sc7 = plt.scatter(x, y, s=20, c=torSliceDict.get('drift_er_rel_mag'), cmap='plasma') plt.colorbar(sc7) - +plt.savefig(path+title+'.png') plot8 = plt.figure(8) plt.xlabel('Radial Position [cm]') plt.ylabel('Vertical Position [cm]') -plt.title('Magnitude of Efield (Rad)') +plt.title('Magnitude of Efield_Rad') sc8 = plt.scatter(x, y, s=20, c= [x[0] for x in torSliceDict.get('efield_perp')], cmap='plasma') plt.colorbar(sc8) - +plt.savefig(path+title+'.png') plot9 = plt.figure(9) plt.xlabel('Radial Position [cm]') plt.ylabel('Vertical Position [cm]') plt.title('Magnitude of Efield (perp)') sc9 = plt.scatter(x, y, s=20, c= [x[2] for x in torSliceDict.get('efield_perp')], cmap='plasma') plt.colorbar(sc9) +plt.savefig(path+title+'.png') - -plt.show() +#plt.show() -- GitLab