def __init__(self, iplot=False, angle=10, pickleName='thHeat.pickle'): """ :param iplot: a boolean to toggle the plots on/off :type iplot: bool :param angle: the integration angle in degrees :type angle: float :pickleName: calculations a """ angle = angle * np.pi / 180 if os.path.exists('tInitAvg'): file = open('tInitAvg', 'r') tstart = float(file.readline()) file.close() logFiles = scanDir('log.*') tags = [] for lg in logFiles: nml = MagicSetup(quiet=True, nml=lg) if nml.start_time > tstart: if os.path.exists('bLayersR.%s' % nml.tag): tags.append(nml.tag) if len(tags) == 0: tags = [nml.tag] print('Only 1 tag: %s' % tags) MagicSetup.__init__(self, quiet=True, nml=logFiles[-1]) a = AvgField() self.nuss = a.nuss else: logFiles = scanDir('log.*') MagicSetup.__init__(self, quiet=True, nml=logFiles[-1]) if not os.path.exists(pickleName): # reading ATmov k = 0 for tag in tags: file = 'ATmov.%s' % tag if os.path.exists(file): if k == 0: m = Movie(file=file, iplot=False) print(file) else: m += Movie(file=file, iplot=False) print(file) k += 1 # reading AHF_mov kk = 0 for tag in tags: file = 'AHF_mov.%s' % tag if os.path.exists(file): if kk == 0: m1 = Movie(file=file, iplot=False) print(file) else: m1 += Movie(file=file, iplot=False) print(file) kk += 1 self.tempmean = m.data[0, ...].mean(axis=0) self.tempstd = m.data[0, ...].std(axis=0) self.colat = m.theta if kk > 0: # i.e. at least one AHF_mov file has been found self.fluxmean = m1.data[0, ...].mean(axis=0) self.fluxstd = m1.data[0, ...].std(axis=0) else: self.fluxmean = rderavg(self.tempmean, eta=self.radratio, exclude=False, spectral=False) self.fluxstd = rderavg(self.tempstd, eta=self.radratio, exclude=False, spectral=False) # Pickle saving file = open(pickleName, 'wb') pickle.dump([self.colat, self.tempmean, self.tempstd,\ self.fluxmean, self.fluxstd], file) file.close() else: file = open(pickleName, 'r') dat = pickle.load(file) if len(dat) == 5: self.colat, self.tempmean, self.tempstd, \ self.fluxmean, self.fluxstd = dat else: self.colat, self.tempmean, self.fluxmean = dat self.fluxstd = np.zeros_like(self.fluxmean) self.tempstd = np.zeros_like(self.fluxmean) file.close() self.ri = self.radratio/(1.-self.radratio) self.ro = 1./(1.-self.radratio) self.ntheta, self.nr = self.tempmean.shape self.radius = chebgrid(self.nr-1, self.ro, self.ri) th2D = np.zeros((self.ntheta, self.nr), dtype=self.radius.dtype) #self.colat = np.linspace(0., np.pi, self.ntheta) for i in range(self.ntheta): th2D[i, :] = self.colat[i] self.temprmmean = 0.5*simps(self.tempmean*np.sin(th2D), th2D, axis=0) self.temprmstd = 0.5*simps(self.tempstd*np.sin(th2D), th2D, axis=0) sinTh = np.sin(self.colat) d1 = matder(self.nr-1, self.ro, self.ri) # Conducting temperature profile (Boussinesq only!) self.tcond = self.ri*self.ro/self.radius-self.ri+self.temprmmean[0] self.fcond = -self.ri*self.ro/self.radius**2 self.nusstopmean = self.fluxmean[:, 0] / self.fcond[0] self.nussbotmean = self.fluxmean[:, -1] / self.fcond[-1] self.nusstopstd = self.fluxstd[:, 0] / self.fcond[0] self.nussbotstd = self.fluxstd[:, -1] / self.fcond[-1] # Close to the equator mask2D = (th2D>=np.pi/2.-angle/2.)*(th2D<=np.pi/2+angle/2.) mask = (self.colat>=np.pi/2.-angle/2.)*(self.colat<=np.pi/2+angle/2.) fac = 1./simps(sinTh[mask], self.colat[mask]) self.nussBotEq = fac*simps(self.nussbotmean[mask]*sinTh[mask], self.colat[mask]) self.nussTopEq = fac*simps(self.nusstopmean[mask]*sinTh[mask], self.colat[mask]) sinC = sinTh.copy() sinC[~mask] = 0. fac = 1./simps(sinC, self.colat) tempC = self.tempmean.copy() tempC[~mask2D] = 0. self.tempEqmean = fac*simps(tempC*np.sin(th2D), th2D, axis=0) tempC = self.tempstd.copy() tempC[~mask2D] = 0. self.tempEqstd = fac*simps(tempC*np.sin(th2D), th2D, axis=0) dtempEq = np.dot(d1, self.tempEqmean) self.betaEq = dtempEq[self.nr/2] # 45\deg inclination mask2D = (th2D>=np.pi/4.-angle/2.)*(th2D<=np.pi/4+angle/2.) mask = (self.colat>=np.pi/4.-angle/2.)*(self.colat<=np.pi/4+angle/2.) fac = 1./simps(np.sin(self.colat[mask]), self.colat[mask]) nussBot45NH = fac*simps(self.nussbotmean[mask]*sinTh[mask], self.colat[mask]) nussTop45NH = fac*simps(self.nusstopmean[mask]*sinTh[mask], self.colat[mask]) sinC = sinTh.copy() sinC[~mask] = 0. fac = 1./simps(sinC, self.colat) tempC = self.tempmean.copy() tempC[~mask2D] = 0. temp45NH = fac*simps(tempC*np.sin(th2D), th2D, axis=0) mask2D = (th2D>=3.*np.pi/4.-angle/2.)*(th2D<=3.*np.pi/4+angle/2.) mask = (self.colat>=3.*np.pi/4.-angle/2.)*(self.colat<=3.*np.pi/4+angle/2.) fac = 1./simps(np.sin(self.colat[mask]), self.colat[mask]) nussBot45SH = fac*simps(self.nussbotmean[mask]*sinTh[mask], self.colat[mask]) nussTop45SH = fac*simps(self.nusstopmean[mask]*sinTh[mask], self.colat[mask]) sinC = sinTh.copy() sinC[~mask] = 0. fac = 1./simps(sinC, self.colat) tempC = self.tempmean.copy() tempC[~mask2D] = 0. temp45SH = fac*simps(tempC*np.sin(th2D), th2D, axis=0) self.nussTop45 = 0.5*(nussTop45NH+nussTop45SH) self.nussBot45 = 0.5*(nussBot45NH+nussBot45SH) self.temp45 = 0.5*(temp45NH+temp45SH) dtemp45 = np.dot(d1, self.temp45) self.beta45 = dtemp45[self.nr/2] # Polar regions mask2D = (th2D<=angle/2.) mask = (self.colat<=angle/2.) fac = 1./simps(np.sin(self.colat[mask]), self.colat[mask]) nussBotPoNH = fac*simps(self.nussbotmean[mask]*sinTh[mask], self.colat[mask]) nussTopPoNH = fac*simps(self.nusstopmean[mask]*sinTh[mask], self.colat[mask]) sinC = sinTh.copy() sinC[~mask] = 0. fac = 1./simps(sinC, self.colat) tempC = self.tempmean.copy() tempC[~mask2D] = 0. tempPolNHmean = fac*simps(tempC*np.sin(th2D), th2D, axis=0) tempC = self.tempstd.copy() tempC[~mask2D] = 0. tempPolNHstd = fac*simps(tempC*np.sin(th2D), th2D, axis=0) mask2D = (th2D>=np.pi-angle/2.) mask = (self.colat>=np.pi-angle/2.) fac = 1./simps(np.sin(self.colat[mask]), self.colat[mask]) nussBotPoSH = fac*simps(self.nussbotmean[mask]*sinTh[mask], self.colat[mask]) nussTopPoSH = fac*simps(self.nusstopmean[mask]*sinTh[mask], self.colat[mask]) sinC = sinTh.copy() sinC[~mask] = 0. fac = 1./simps(sinC, self.colat) tempC = self.tempmean.copy() tempC[~mask2D] = 0. tempPolSHmean = fac*simps(tempC*np.sin(th2D), th2D, axis=0) tempC = self.tempstd.copy() tempC[~mask2D] = 0. tempPolSHstd = fac*simps(tempC*np.sin(th2D), th2D, axis=0) self.nussBotPo = 0.5*(nussBotPoNH+nussBotPoSH) self.nussTopPo = 0.5*(nussTopPoNH+nussTopPoSH) self.tempPolmean = 0.5*(tempPolNHmean+tempPolSHmean) self.tempPolstd= 0.5*(tempPolNHstd+tempPolSHstd) dtempPol = np.dot(d1, self.tempPolmean) self.betaPol = dtempPol[self.nr/2] # Inside and outside TC angleTC = np.arcsin(self.ri/self.ro) mask2D = (th2D<=angleTC) mask = (self.colat<=angleTC) fac = 1./simps(np.sin(self.colat[mask]), self.colat[mask]) nussITC_NH = fac*simps(self.nusstopmean[mask]*sinTh[mask], self.colat[mask]) mask2D = (th2D>=np.pi-angleTC) mask = (self.colat>=np.pi-angleTC) fac = 1./simps(np.sin(self.colat[mask]), self.colat[mask]) nussITC_SH = fac*simps(self.nusstopmean[mask]*sinTh[mask], self.colat[mask]) self.nussITC = 0.5*(nussITC_NH+nussITC_SH) mask2D = (th2D>=angleTC)*(th2D<=np.pi-angleTC) mask = (self.colat>=angleTC)*(self.colat<=np.pi-angleTC) fac = 1./simps(sinTh[mask], self.colat[mask]) self.nussOTC = fac*simps(self.nusstopmean[mask]*sinTh[mask], self.colat[mask]) if iplot: self.plot() print(self)
def __init__(self, iplot=False, quiet=False): """ :param iplot: display the result when set to True (default False) :type iplot: bool :param quiet: less verbose when set to True (default is False) :type quiet: bool """ if os.path.exists('tInitAvg'): file = open('tInitAvg', 'r') tstart = float(file.readline()) file.close() logFiles = scanDir('log.*') tags = [] for lg in logFiles: nml = MagicSetup(quiet=True, nml=lg) if nml.start_time > tstart: if os.path.exists('bLayersR.%s' % nml.tag): tags.append(nml.tag) if len(tags) > 0: print(tags) else: tags = None MagicSetup.__init__(self, quiet=True, nml=logFiles[-1]) a = AvgField() self.nuss = a.nuss self.reynolds = a.reynolds else: logFiles = scanDir('log.*') MagicSetup.__init__(self, quiet=True, nml=logFiles[-1]) tags = None self.nuss = 1. self.reynolds = 1. par = MagicRadial(field='bLayersR', iplot=False, tags=tags) self.varS = N.sqrt(N.abs(par.varS)) self.ss = par.entropy if os.path.exists('tInitAvg'): logFiles = scanDir('log.*', tfix=1409827718.0) # Workaround for code mistake before this time tfix = 1409827718.0 tagsFix = [] for lg in logFiles: nml = MagicSetup(quiet=True, nml=lg) if nml.start_time > tstart: if os.path.exists('bLayersR.%s' % nml.tag): tagsFix.append(nml.tag) if len(tagsFix) > 0: print('Fix temp. tags', tagsFix) parFix = MagicRadial(field='bLayersR', iplot=False, tags=tagsFix) self.varS = N.sqrt(N.abs(parFix.varS)) self.ss = parFix.entropy self.tags = tagsFix self.uh = par.uh self.duh = par.duhdr self.rad = par.radius self.ro = self.rad[0] self.ri = self.rad[-1] self.reh = 4.*N.pi*intcheb(self.rad**2*self.uh, len(self.rad)-1, self.ri, self.ro)/(4./3.*N.pi*(self.ro**3-self.ri**3)) # Thermal dissipation boundary layer if hasattr(par, 'dissS'): self.dissS = par.dissS self.epsT = -4.*N.pi*intcheb(self.rad**2*self.dissS, len(self.rad)-1, self.ro, self.ri) self.epsTR = 4.*N.pi*self.rad**2*self.dissS ind = getMaxima(-abs(self.epsTR-self.epsT)) try: self.dissTopS = self.ro-self.rad[ind[0]] self.dissBotS = self.rad[ind[-1]]-self.ri self.dissEpsTbl, self.dissEpsTbulk = integBulkBc(self.rad, self.epsTR, self.ri, self.ro, self.dissBotS, self.dissTopS) except IndexError: self.dissTopS = self.ro self.dissBotS = self.ri self.dissEpsTbl, self.dissEpsTbulk = 0., 0. print('thDiss bl, bulk', self.dissEpsTbl/self.epsT, self.dissEpsTbulk/self.epsT) # First way of defining the thermal boundary layers: with var(S) #rThLayer = getMaxima(self.rad, self.varS) ind = argrelextrema(self.varS, N.greater)[0] if len(ind) != 0: self.bcTopVarS = self.ro-self.rad[ind[0]] self.bcBotVarS = self.rad[ind[-1]]-self.ri else: self.bcTopVarS = 1. self.bcBotVarS = 1. if hasattr(self, 'epsT'): self.varSEpsTbl, self.varSEpsTbulk = integBulkBc(self.rad, self.epsTR, self.ri, self.ro, self.bcBotVarS, self.bcTopVarS) print('var(S) bl, bulk', self.varSEpsTbl/self.epsT, self.varSEpsTbulk/self.epsT) # Second way of defining the thermal boundary layers: intersection of the slopes d1 = matder(len(self.rad)-1, self.ro, self.ri) self.ttm = 3.*intcheb(self.ss*self.rad**2, len(self.rad)-1, self.ri, self.ro) \ /(self.ro**3-self.ri**3) dsdr = N.dot(d1, self.ss) self.beta = dsdr[len(dsdr)/2] print('beta', self.beta) self.slopeTop = dsdr[2]*(self.rad-self.ro)+self.ss[0] self.slopeBot = dsdr[-1]*(self.rad-self.ri)+self.ss[-1] self.dtdrm = dsdr[len(self.ss)/2] self.slopeMid = self.dtdrm*(self.rad-(self.ri+self.ro)/2.)+self.ss[len(self.ss)/2] #self.bcTopSlope = -(self.ttm-self.ss[0])/dsdr[2] self.bcTopSlope = (self.ss[len(self.ss)/2]-self.ss[0])/(self.dtdrm-dsdr[2]) #self.bcBotSlope = (self.ttm-self.ss[-1])/(dsdr[-1]) self.bcBotSlope = -(self.ss[len(self.ss)/2]-self.ss[-1])/(self.dtdrm-dsdr[-1]) # 2nd round with a more accurate slope bSlope = dsdr[self.rad <= self.ri+self.bcBotSlope/4.].mean() tSlope = dsdr[self.rad >= self.ro-self.bcTopSlope/4.].mean() self.slopeBot = bSlope*(self.rad-self.ri)+self.ss[-1] self.slopeTop = tSlope*(self.rad-self.ro)+self.ss[0] #self.bcTopSlope = -(self.ttm-self.ss[0])/tSlope self.bcTopSlope = (self.ss[len(self.ss)/2]-self.ss[0])/(self.dtdrm-tSlope) #self.bcBotSlope = (self.ttm-self.ss[-1])/bSlope self.bcBotSlope = -(self.ss[len(self.ss)/2]-self.ss[-1])/(self.dtdrm-bSlope) if hasattr(self, 'epsT'): self.slopeEpsTbl, self.slopeEpsTbulk = integBulkBc(self.rad, self.epsTR, self.ri, self.ro, self.bcBotSlope, self.bcTopSlope) print('slopes bl, bulk', self.slopeEpsTbl/self.epsT, self.slopeEpsTbulk/self.epsT) pow = MagicRadial(field='powerR', iplot=False, tags=tags) self.vi = pow.viscDiss self.buo = pow.buoPower self.epsV = -intcheb(self.vi, len(self.rad)-1, self.ro, self.ri) ind = getMaxima(-abs(self.vi-self.epsV)) if len(ind) > 2: for i in ind: if self.vi[i-1]-self.epsV > 0 and self.vi[i+1]-self.epsV < 0: self.dissTopV = self.ro-self.rad[i] elif self.vi[i-1]-self.epsV < 0 and self.vi[i+1]-self.epsV > 0: self.dissBotV = self.rad[i]-self.ri else: self.dissTopV = self.ro-self.rad[ind[0]] self.dissBotV = self.rad[ind[-1]]-self.ri self.dissEpsVbl, self.dissEpsVbulk = integBulkBc(self.rad, self.vi, self.ri, self.ro, self.dissBotV, self.dissTopV) print('visc Diss bl, bulk', self.dissEpsVbl/self.epsV, self.dissEpsVbulk/self.epsV) # First way of defining the viscous boundary layers: with duhdr #rViscousLayer = getMaxima(self.rad, self.duh) if self.kbotv == 1 and self.ktopv == 1: ind = argrelextrema(self.duh, N.greater)[0] if len(ind) == 0: self.bcTopduh = 1. self.bcBotduh = 1. else: if ind[0] < 4: self.bcTopduh = self.ro-self.rad[ind[1]] else: self.bcTopduh = self.ro-self.rad[ind[0]] if len(self.rad)-ind[-1] < 4: self.bcBotduh = self.rad[ind[-2]]-self.ri else: self.bcBotduh = self.rad[ind[-1]]-self.ri self.slopeTopU = 0. self.slopeBotU = 0. self.uhTopSlope = 0. self.uhBotSlope = 0. self.slopeEpsUbl = 0. self.slopeEpsUbulk = 0. self.uhBot = 0. self.uhTop = 0. else: ind = argrelextrema(self.uh, N.greater)[0] if len(ind) == 1: ind = argrelextrema(self.uh, N.greater_equal)[0] if len(ind) == 0: self.bcTopduh = 1. self.bcBotduh = 1. else: if ind[0] < 4: self.bcTopduh = self.ro-self.rad[ind[1]] else: self.bcTopduh = self.ro-self.rad[ind[0]] if len(self.rad)-ind[-1] < 4: self.bcBotduh = self.rad[ind[-2]]-self.ri else: self.bcBotduh = self.rad[ind[-1]]-self.ri self.uhTop = self.uh[self.rad==self.ro-self.bcTopduh][0] self.uhBot = self.uh[self.rad==self.ri+self.bcBotduh][0] self.bcBotduh, self.bcTopduh, self.uhBot, self.uhTop = \ getAccuratePeaks(self.rad, self.uh, self.uhTop, \ self.uhBot, self.ri, self.ro) duhdr = N.dot(d1, self.uh) #1st round mask = (self.rad>=self.ro-self.bcTopduh/4)*(self.rad<self.ro) slopeT = duhdr[mask].mean() mask = (self.rad<=self.ri+self.bcBotduh/4)*(self.rad>self.ri) slopeB = duhdr[mask].mean() self.slopeTopU = slopeT*(self.rad-self.ro)+self.uh[0] self.slopeBotU = slopeB*(self.rad-self.ri)+self.uh[-1] self.uhTopSlope = -self.uhTop/slopeT self.uhBotSlope = self.uhBot/slopeB #2nd round mask = (self.rad>=self.ro-self.uhTopSlope/4.)*(self.rad<self.ro) slopeT = duhdr[mask].mean() mask = (self.rad<=self.ri+self.uhBotSlope/4)*(self.rad>self.ri) slopeB = duhdr[mask].mean() self.uhTopSlope = -self.uhTop/slopeT self.uhBotSlope = self.uhBot/slopeB self.slopeEpsUbl, self.slopeEpsUbulk = integBulkBc(self.rad, self.vi, self.ri, self.ro, self.uhBotSlope, self.uhTopSlope) self.uhEpsVbl, self.uhEpsVbulk = integBulkBc(self.rad, self.vi, self.ri, self.ro, self.bcBotduh, self.bcTopduh) print('uh bl, bulk', self.uhEpsVbl/self.epsV, self.uhEpsVbulk/self.epsV) # Convective Rol in the thermal boundary Layer par = MagicRadial(field='parR', iplot=False, tags=tags) kin = MagicRadial(field='eKinR', iplot=False, tags=tags) ekinNas = kin.ekin_pol+kin.ekin_tor-kin.ekin_pol_axi-kin.ekin_tor_axi ReR = N.sqrt(2.*abs(ekinNas)/par.radius**2/(4.*N.pi)) RolC = ReR*par.ek/par.dlVc self.dl = par.dlVc y = RolC[par.radius >= self.ro-self.bcTopSlope] x = par.radius[par.radius >= self.ro-self.bcTopSlope] self.rolTop = simps(3.*y*x**2, x)/(self.ro**3-(self.ro-self.bcTopSlope)**3) self.rolbl, self.rolbulk = integBulkBc(self.rad, 4.*N.pi*RolC*self.rad**2, self.ri, self.ro, self.bcBotSlope, self.bcTopSlope, normed=True) self.rebl, self.rebulk = integBulkBc(self.rad, 4.*N.pi*ReR*self.rad**2, self.ri, self.ro, self.bcBotduh, self.bcTopduh, normed=True) self.lengthbl, self.lengthbulk = integBulkBc(self.rad, par.dlVc, self.ri, self.ro, self.bcBotSlope, self.bcTopSlope, normed=True) self.rehbl, self.rehbulk = integBulkBc(self.rad, self.uh*4.*N.pi*self.rad**2, self.ri, self.ro, self.bcBotduh, self.bcTopduh, normed=True) y = RolC[par.radius <= self.ri+self.bcBotSlope] x = par.radius[par.radius <= self.ri+self.bcBotSlope] self.rolBot = simps(3.*y*x**2, x)/((self.ri+self.bcBotSlope)**3-self.ri**3) print('reynols bc, reynolds bulk', self.rebl, self.rebulk) print('reh bc, reh bulk', self.rehbl, self.rehbulk) print('rolbc, rolbulk, roltop, rolbot', self.rolbl, self.rolbulk, self.rolBot, self.rolTop) par.dlVc[0] = 0. par.dlVc[-1] = 0. self.lBot, self.lTop = integBotTop(self.rad, 4.*N.pi*self.rad**2*par.dlVc, self.ri, self.ro, self.bcBotSlope, self.bcTopSlope, normed=True) uhbm, utbm = integBotTop(self.rad, 4.*N.pi*self.uh, self.ri, self.ro, self.bcBotSlope, self.bcTopSlope, normed=True) if iplot: self.plot() if not quiet: print(self)
def __init__(self, iplot=False, quiet=False): """ :param iplot: display the result when set to True (default False) :type iplot: bool :param quiet: less verbose when set to True (default is False) :type quiet: bool """ if os.path.exists('tInitAvg'): file = open('tInitAvg', 'r') tstart = float(file.readline()) file.close() logFiles = scanDir('log.*') tags = [] for lg in logFiles: nml = MagicSetup(quiet=True, nml=lg) if nml.start_time > tstart: if os.path.exists('bLayersR.{}'.format(nml.tag)): tags.append(nml.tag) if len(tags) > 0: print(tags) else: tags = None MagicSetup.__init__(self, quiet=True, nml=logFiles[-1]) a = AvgField(model=json_model, write=False) self.nuss = 0.5 * (a.topnuss_av + a.botnuss_av) self.reynolds = a.rm_av e2fluct = a.ekin_pol_av + a.ekin_tor_av - a.ekin_pol_axi_av - a.ekin_tor_axi_av else: logFiles = scanDir('log.*') MagicSetup.__init__(self, quiet=True, nml=logFiles[-1]) tags = None self.nuss = 1. self.reynolds = 1. e2fluct = 1. par = MagicRadial(field='bLayersR', iplot=False, tags=tags) self.varS = abs(par.entropy_SD) self.ss = par.entropy if os.path.exists('tInitAvg'): logFiles = scanDir('log.*', tfix=1409827718.0) # Workaround for code mistake before this time tfix = 1409827718.0 tagsFix = [] for lg in logFiles: nml = MagicSetup(quiet=True, nml=lg) if nml.start_time > tstart: if os.path.exists('bLayersR.{}'.format(nml.tag)): tagsFix.append(nml.tag) if len(tagsFix) > 0: print('Fix temp. tags', tagsFix) parFix = MagicRadial(field='bLayersR', iplot=False, tags=tagsFix) self.varS = abs(parFix.entropy_SD) self.ss = parFix.entropy self.tags = tagsFix self.uh = par.uh self.duh = par.duhdr self.rad = par.radius self.ro = self.rad[0] self.ri = self.rad[-1] vol_oc = 4. / 3. * np.pi * (self.ro**3 - self.ri**3) self.rey_fluct = np.sqrt(2. * e2fluct / vol_oc) self.reh = 4. * np.pi * intcheb(self.rad**2 * self.uh, len(self.rad) - 1, self.ri, self.ro) / (4. / 3. * np.pi * (self.ro**3 - self.ri**3)) # Thermal dissipation boundary layer if hasattr(par, 'dissS'): self.dissS = par.dissS self.epsT = -4. * np.pi * intcheb(self.rad**2 * self.dissS, len(self.rad) - 1, self.ro, self.ri) self.epsTR = 4. * np.pi * self.rad**2 * self.dissS ind = getMaxima(-abs(self.epsTR - self.epsT)) try: self.dissTopS = self.ro - self.rad[ind[0]] self.dissBotS = self.rad[ind[-1]] - self.ri self.dissEpsTbl, self.dissEpsTbulk = integBulkBc( self.rad, self.epsTR, self.ri, self.ro, self.dissBotS, self.dissTopS) except IndexError: self.dissTopS = self.ro self.dissBotS = self.ri self.dissEpsTbl, self.dissEpsTbulk = 0., 0. print('thDiss bl, bulk', self.dissEpsTbl / self.epsT, self.dissEpsTbulk / self.epsT) # First way of defining the thermal boundary layers: with var(S) #rThLayer = getMaxima(self.rad, self.varS) ind = argrelextrema(self.varS, np.greater)[0] if len(ind) != 0: self.bcTopVarS = self.ro - self.rad[ind[0]] self.bcBotVarS = self.rad[ind[-1]] - self.ri else: self.bcTopVarS = 1. self.bcBotVarS = 1. if hasattr(self, 'epsT'): self.varSEpsTbl, self.varSEpsTbulk = integBulkBc( self.rad, self.epsTR, self.ri, self.ro, self.bcBotVarS, self.bcTopVarS) print('var(S) bl, bulk', self.varSEpsTbl / self.epsT, self.varSEpsTbulk / self.epsT) # Second way of defining the thermal boundary layers: intersection of the slopes d1 = matder(len(self.rad) - 1, self.ro, self.ri) self.ttm = 3.*intcheb(self.ss*self.rad**2, len(self.rad)-1, self.ri, self.ro) \ /(self.ro**3-self.ri**3) dsdr = np.dot(d1, self.ss) self.beta = dsdr[len(dsdr) // 2] print('beta={:.2f}'.format(self.beta)) self.slopeTop = dsdr[2] * (self.rad - self.ro) + self.ss[0] self.slopeBot = dsdr[-1] * (self.rad - self.ri) + self.ss[-1] self.dtdrm = dsdr[len(self.ss) // 2] tmid = self.ss[len(self.ss) // 2] self.slopeMid = self.dtdrm * (self.rad - self.rad[len(self.rad) // 2]) + tmid self.bcTopSlope = (tmid - self.ss[0]) / (self.dtdrm - dsdr[2]) self.bcBotSlope = -(tmid - self.ss[-1]) / (self.dtdrm - dsdr[-1]) # 2nd round with a more accurate slope bSlope = dsdr[self.rad <= self.ri + self.bcBotSlope / 4.].mean() tSlope = dsdr[self.rad >= self.ro - self.bcTopSlope / 4.].mean() self.slopeBot = bSlope * (self.rad - self.ri) + self.ss[-1] self.slopeTop = tSlope * (self.rad - self.ro) + self.ss[0] #self.bcTopSlope = -(self.ttm-self.ss[0])/tSlope self.bcTopSlope = -(tmid-self.dtdrm*self.rad[len(self.rad)//2] - self.ss[0] \ + tSlope*self.ro)/(self.dtdrm-tSlope) self.bcBotSlope = -(tmid-self.dtdrm*self.rad[len(self.rad)//2] - self.ss[-1] \ + bSlope*self.ri)/(self.dtdrm-bSlope) self.dto = tSlope * (self.bcTopSlope - self.ro) + self.ss[0] self.dti = bSlope * (self.bcBotSlope - self.ri) + self.ss[-1] self.dto = self.dto - self.ss[0] self.dti = self.ss[-1] - self.dti self.bcTopSlope = self.ro - self.bcTopSlope self.bcBotSlope = self.bcBotSlope - self.ri if hasattr(self, 'epsT'): self.slopeEpsTbl, self.slopeEpsTbulk = integBulkBc( self.rad, self.epsTR, self.ri, self.ro, self.bcBotSlope, self.bcTopSlope) print('slopes bl, bulk', self.slopeEpsTbl / self.epsT, self.slopeEpsTbulk / self.epsT) self.vi = a.viscDissR_av self.buo = a.buoPowerR_av self.epsV = -intcheb(self.vi, len(self.rad) - 1, self.ro, self.ri) ind = getMaxima(-abs(self.vi - self.epsV)) if len(ind) > 2: for i in ind: if self.vi[i - 1] - self.epsV > 0 and self.vi[ i + 1] - self.epsV < 0: self.dissTopV = self.ro - self.rad[i] elif self.vi[i - 1] - self.epsV < 0 and self.vi[ i + 1] - self.epsV > 0: self.dissBotV = self.rad[i] - self.ri else: self.dissTopV = self.ro - self.rad[ind[0]] self.dissBotV = self.rad[ind[-1]] - self.ri try: self.dissEpsVbl, self.dissEpsVbulk = integBulkBc( self.rad, self.vi, self.ri, self.ro, self.dissBotV, self.dissTopV) except AttributeError: self.dissTopV = 0. self.dissBotV = 0. self.dissEpsVbl = 0. self.dissEpsVbulk = 0. print('visc Diss bl, bulk', self.dissEpsVbl / self.epsV, self.dissEpsVbulk / self.epsV) # First way of defining the viscous boundary layers: with duhdr #rViscousLayer = getMaxima(self.rad, self.duh) if self.kbotv == 1 and self.ktopv == 1: ind = argrelextrema(self.duh, np.greater)[0] if len(ind) == 0: self.bcTopduh = 1. self.bcBotduh = 1. else: if ind[0] < 4: self.bcTopduh = self.ro - self.rad[ind[1]] else: self.bcTopduh = self.ro - self.rad[ind[0]] if len(self.rad) - ind[-1] < 4: self.bcBotduh = self.rad[ind[-2]] - self.ri else: self.bcBotduh = self.rad[ind[-1]] - self.ri self.slopeTopU = 0. self.slopeBotU = 0. self.uhTopSlope = 0. self.uhBotSlope = 0. self.slopeEpsUbl = 0. self.slopeEpsUbulk = 0. self.uhBot = 0. self.uhTop = 0. else: ind = argrelextrema(self.uh, np.greater)[0] if len(ind) == 1: ind = argrelextrema(self.uh, np.greater_equal)[0] if len(ind) == 0: self.bcTopduh = 1. self.bcBotduh = 1. else: if ind[0] < 4: self.bcTopduh = self.ro - self.rad[ind[1]] else: self.bcTopduh = self.ro - self.rad[ind[0]] if len(self.rad) - ind[-1] < 4: self.bcBotduh = self.rad[ind[-2]] - self.ri else: self.bcBotduh = self.rad[ind[-1]] - self.ri self.uhTop = self.uh[self.rad == self.ro - self.bcTopduh][0] self.uhBot = self.uh[self.rad == self.ri + self.bcBotduh][0] self.bcBotduh, self.bcTopduh, self.uhBot, self.uhTop = \ getAccuratePeaks(self.rad, self.uh, self.uhTop, \ self.uhBot, self.ri, self.ro) duhdr = np.dot(d1, self.uh) #1st round mask = (self.rad >= self.ro - self.bcTopduh / 4) * (self.rad < self.ro) slopeT = duhdr[mask].mean() mask = (self.rad <= self.ri + self.bcBotduh / 4) * (self.rad > self.ri) slopeB = duhdr[mask].mean() self.slopeTopU = slopeT * (self.rad - self.ro) + self.uh[0] self.slopeBotU = slopeB * (self.rad - self.ri) + self.uh[-1] self.uhTopSlope = -self.uhTop / slopeT self.uhBotSlope = self.uhBot / slopeB #2nd round mask = (self.rad >= self.ro - self.uhTopSlope / 4.) * (self.rad < self.ro) slopeT = duhdr[mask].mean() mask = (self.rad <= self.ri + self.uhBotSlope / 4) * (self.rad > self.ri) slopeB = duhdr[mask].mean() self.uhTopSlope = -self.uhTop / slopeT self.uhBotSlope = self.uhBot / slopeB self.slopeEpsUbl, self.slopeEpsUbulk = integBulkBc( self.rad, self.vi, self.ri, self.ro, self.uhBotSlope, self.uhTopSlope) self.uhEpsVbl, self.uhEpsVbulk = integBulkBc(self.rad, self.vi, self.ri, self.ro, self.bcBotduh, self.bcTopduh) print('uh bl, bulk', self.uhEpsVbl / self.epsV, self.uhEpsVbulk / self.epsV) # Convective Rol in the thermal boundary Layer ekinNas = a.ekin_polR_av + a.ekin_torR_av - a.ekin_pol_axiR_av - a.ekin_tor_axiR_av ReR = np.sqrt(2. * abs(ekinNas) / self.rad**2 / (4. * np.pi)) self.dl = a.dlVcR_av RolC = ReR * self.ek / self.dl y = RolC[self.rad >= self.ro - self.bcTopSlope] x = self.rad[self.rad >= self.ro - self.bcTopSlope] try: self.rolTop = simps(3. * y * x**2, x) / (self.ro**3 - (self.ro - self.bcTopSlope)**3) except IndexError: self.rolTop = 0. self.rolbl, self.rolbulk = integBulkBc(self.rad, 4. * np.pi * RolC * self.rad**2, self.ri, self.ro, self.bcBotSlope, self.bcTopSlope, normed=True) self.rebl, self.rebulk = integBulkBc(self.rad, 4. * np.pi * ReR * self.rad**2, self.ri, self.ro, self.bcBotSlope, self.bcTopSlope, normed=True) self.lengthbl, self.lengthbulk = integBulkBc(self.rad, self.dl * 4. * np.pi * self.rad**2, self.ri, self.ro, self.bcBotSlope, self.bcTopSlope, normed=True) self.rehbl, self.rehbulk = integBulkBc(self.rad, self.uh * 4. * np.pi * self.rad**2, self.ri, self.ro, self.bcBotduh, self.bcTopduh, normed=True) y = RolC[self.rad <= self.ri + self.bcBotSlope] x = self.rad[self.rad <= self.ri + self.bcBotSlope] self.rolBot = simps(3. * y * x**2, x) / ( (self.ri + self.bcBotSlope)**3 - self.ri**3) print('reynols bc, reynolds bulk', self.rebl, self.rebulk) print('reh bc, reh bulk', self.rehbl, self.rehbulk) print('rolbc, rolbulk, roltop, rolbot', self.rolbl, self.rolbulk, self.rolBot, self.rolTop) self.dl[0] = 0. self.dl[-1] = 0. self.lBot, self.lTop = integBotTop(self.rad, 4. * np.pi * self.rad**2 * self.dl, self.ri, self.ro, self.bcBotSlope, self.bcTopSlope, normed=True) uhbm, utbm = integBotTop(self.rad, 4. * np.pi * self.uh, self.ri, self.ro, self.bcBotSlope, self.bcTopSlope, normed=True) # Convective Rol in the thermal boundary Layer if len(scanDir('perpParR.*')) != 0: tags = [] for lg in logFiles: nml = MagicSetup(quiet=True, nml=lg) if nml.start_time > tstart: if os.path.exists('perpParR.{}'.format(nml.tag)): tags.append(nml.tag) perpPar = MagicRadial(field='perpParR', iplot=False, tags=tags) eperpNas = perpPar.Eperp - perpPar.Eperp_axi eparNas = perpPar.Epar - perpPar.Epar_axi RePerpNas = np.sqrt(2. * abs(eperpNas)) ReParNas = np.sqrt(2. * abs(eparNas)) RePerp = np.sqrt(2. * abs(perpPar.Eperp)) RePar = np.sqrt(2. * abs(perpPar.Epar)) self.reperpbl, self.reperpbulk = integBulkBc(self.rad, 4. * np.pi * RePerp * self.rad**2, self.ri, self.ro, self.bcBotSlope, self.bcTopSlope, normed=True) self.reparbl, self.reparbulk = integBulkBc(self.rad, 4. * np.pi * RePar * self.rad**2, self.ri, self.ro, self.bcBotSlope, self.bcTopSlope, normed=True) self.reperpnasbl, self.reperpnasbulk = integBulkBc( self.rad, 4. * np.pi * RePerpNas * self.rad**2, self.ri, self.ro, self.bcBotSlope, self.bcTopSlope, normed=True) self.reparnasbl, self.reparnasbulk = integBulkBc( self.rad, 4. * np.pi * ReParNas * self.rad**2, self.ri, self.ro, self.bcBotSlope, self.bcTopSlope, normed=True) else: self.reperpbl = 0. self.reperpbulk = 0. self.reparbl = 0. self.reparbulk = 0. self.reperpnasbl = 0. self.reperpnasbulk = 0. self.reparnasbl = 0. self.reparnasbulk = 0. if iplot: self.plot() if not quiet: print(self)
def __init__(self, iplot=False, angle=10, pickleName='thHeat.pickle'): """ :param iplot: a boolean to toggle the plots on/off :type iplot: bool :param angle: the integration angle in degrees :type angle: float :pickleName: calculations a """ angle = angle * np.pi / 180 if os.path.exists('tInitAvg'): file = open('tInitAvg', 'r') tstart = float(file.readline()) file.close() logFiles = scanDir('log.*') tags = [] for lg in logFiles: nml = MagicSetup(quiet=True, nml=lg) if nml.start_time > tstart: if os.path.exists('bLayersR.%s' % nml.tag): tags.append(nml.tag) if len(tags) == 0: tags = [nml.tag] print('Only 1 tag: %s' % tags) MagicSetup.__init__(self, quiet=True, nml=logFiles[-1]) a = AvgField() self.nuss = a.nuss else: logFiles = scanDir('log.*') MagicSetup.__init__(self, quiet=True, nml=logFiles[-1]) if not os.path.exists(pickleName): # reading ATmov k = 0 for tag in tags: file = 'ATmov.%s' % tag if os.path.exists(file): if k == 0: m = Movie(file=file, iplot=False) print(file) else: m += Movie(file=file, iplot=False) print(file) k += 1 # reading AHF_mov kk = 0 for tag in tags: file = 'AHF_mov.%s' % tag if os.path.exists(file): if kk == 0: m1 = Movie(file=file, iplot=False) print(file) else: m1 += Movie(file=file, iplot=False) print(file) kk += 1 self.tempmean = m.data.mean(axis=0) self.colat = m.theta if kk > 0: # i.e. at least one AHF_mov file has been found self.flux = m1.data.mean(axis=0) else: self.flux = rderavg(self.tempmean, eta=self.radratio, exclude=False, spectral=False) # Pickle saving file = open(pickleName, 'wb') pickle.dump([self.colat, self.tempmean, self.flux], file) file.close() else: file = open(pickleName, 'r') self.colat, self.tempmean, self.flux = pickle.load(file) file.close() self.ri = self.radratio/(1.-self.radratio) self.ro = 1./(1.-self.radratio) self.ntheta, self.nr = self.tempmean.shape self.radius = chebgrid(self.nr-1, self.ro, self.ri) th2D = np.zeros((self.ntheta, self.nr), dtype=self.radius.dtype) #self.colat = np.linspace(0., np.pi, self.ntheta) for i in range(self.ntheta): th2D[i, :] = self.colat[i] self.temprm = 0.5*simps(self.tempmean*np.sin(th2D), th2D, axis=0) sinTh = np.sin(self.colat) d1 = matder(self.nr-1, self.ro, self.ri) # Conducting temperature profile (Boussinesq only!) self.tcond = self.ri*self.ro/self.radius-self.ri+self.temprm[0] self.fcond = -self.ri*self.ro/self.radius**2 self.nusstop = self.flux[:, 0] / self.fcond[0] self.nussbot = self.flux[:, -1] / self.fcond[-1] # Close to the equator mask2D = (th2D>=np.pi/2.-angle/2.)*(th2D<=np.pi/2+angle/2.) mask = (self.colat>=np.pi/2.-angle/2.)*(self.colat<=np.pi/2+angle/2.) fac = 1./simps(sinTh[mask], self.colat[mask]) self.nussBotEq = fac*simps(self.nussbot[mask]*sinTh[mask], self.colat[mask]) self.nussTopEq = fac*simps(self.nusstop[mask]*sinTh[mask], self.colat[mask]) sinC = sinTh.copy() sinC[~mask] = 0. fac = 1./simps(sinC, self.colat) tempC = self.tempmean.copy() tempC[~mask2D] = 0. self.tempEq = fac*simps(tempC*np.sin(th2D), th2D, axis=0) dtempEq = np.dot(d1, self.tempEq) self.betaEq = dtempEq[self.nr/2] # 45\deg inclination mask2D = (th2D>=np.pi/4.-angle/2.)*(th2D<=np.pi/4+angle/2.) mask = (self.colat>=np.pi/4.-angle/2.)*(self.colat<=np.pi/4+angle/2.) fac = 1./simps(np.sin(self.colat[mask]), self.colat[mask]) nussBot45NH = fac*simps(self.nussbot[mask]*sinTh[mask], self.colat[mask]) nussTop45NH = fac*simps(self.nusstop[mask]*sinTh[mask], self.colat[mask]) sinC = sinTh.copy() sinC[~mask] = 0. fac = 1./simps(sinC, self.colat) tempC = self.tempmean.copy() tempC[~mask2D] = 0. temp45NH = fac*simps(tempC*np.sin(th2D), th2D, axis=0) mask2D = (th2D>=3.*np.pi/4.-angle/2.)*(th2D<=3.*np.pi/4+angle/2.) mask = (self.colat>=3.*np.pi/4.-angle/2.)*(self.colat<=3.*np.pi/4+angle/2.) fac = 1./simps(np.sin(self.colat[mask]), self.colat[mask]) nussBot45SH = fac*simps(self.nussbot[mask]*sinTh[mask], self.colat[mask]) nussTop45SH = fac*simps(self.nusstop[mask]*sinTh[mask], self.colat[mask]) sinC = sinTh.copy() sinC[~mask] = 0. fac = 1./simps(sinC, self.colat) tempC = self.tempmean.copy() tempC[~mask2D] = 0. temp45SH = fac*simps(tempC*np.sin(th2D), th2D, axis=0) self.nussTop45 = 0.5*(nussTop45NH+nussTop45SH) self.nussBot45 = 0.5*(nussBot45NH+nussBot45SH) self.temp45 = 0.5*(temp45NH+temp45SH) dtemp45 = np.dot(d1, self.temp45) self.beta45 = dtemp45[self.nr/2] # Polar regions mask2D = (th2D<=angle/2.) mask = (self.colat<=angle/2.) fac = 1./simps(np.sin(self.colat[mask]), self.colat[mask]) nussBotPoNH = fac*simps(self.nussbot[mask]*sinTh[mask], self.colat[mask]) nussTopPoNH = fac*simps(self.nusstop[mask]*sinTh[mask], self.colat[mask]) sinC = sinTh.copy() sinC[~mask] = 0. fac = 1./simps(sinC, self.colat) tempC = self.tempmean.copy() tempC[~mask2D] = 0. tempPolNH = fac*simps(tempC*np.sin(th2D), th2D, axis=0) mask2D = (th2D>=np.pi-angle/2.) mask = (self.colat>=np.pi-angle/2.) fac = 1./simps(np.sin(self.colat[mask]), self.colat[mask]) nussBotPoSH = fac*simps(self.nussbot[mask]*sinTh[mask], self.colat[mask]) nussTopPoSH = fac*simps(self.nusstop[mask]*sinTh[mask], self.colat[mask]) sinC = sinTh.copy() sinC[~mask] = 0. fac = 1./simps(sinC, self.colat) tempC = self.tempmean.copy() tempC[~mask2D] = 0. tempPolSH = fac*simps(tempC*np.sin(th2D), th2D, axis=0) self.nussBotPo = 0.5*(nussBotPoNH+nussBotPoSH) self.nussTopPo = 0.5*(nussTopPoNH+nussTopPoSH) self.tempPol = 0.5*(tempPolNH+tempPolSH) dtempPol = np.dot(d1, self.tempPol) self.betaPol = dtempPol[self.nr/2] if iplot: self.plot() print(self)