• 検索結果がありません。

Example: using derivatives

N/A
N/A
Protected

Academic year: 2021

シェア "Example: using derivatives"

Copied!
4
0
0

読み込み中.... (全文を見る)

全文

(1)

189

Marcus H. Mendenhall, February 1315, 2008

Example: using derivatives

// load an std::vector<G4double> zvals with values of z // and Bzvals with the z component of the field at those points // and create the interpolating_function from them. // This is typically done once at instantiation of a class staticc2_factory<G4double> c2; typedefc2_ptr<G4double> c2_p; c2_p Bzfunc=c2.interpolating_function(zvals, Bzvals); // now, the part below is usually done in a loop // where the field is to be evaluated many times. G4double bz, bzprime, bzprime2; // compute fields at x, y, z near the axis // get Bz on-axis and its derivatives bz=Bzfunc(z, &bzprime, &bzprime2); // x & y magnetic field from divergence equation G4double bx = -x*bzprime/2, by=-y*bzprime/2; // correct bz off-axis to maintain zero curl. bz -= (x*x+y*y)*bzprime2/4.0; Marcus H. Mendenhall, February 1315, 2008

What? • The packa ge I wil l describe pro vides a uni ed platform which int egrat es: • F unctions which pro vide their value and tw o derivatives • R eferenc e c ount ed objects! N o memor y leaks. • C reation of cubic spline int erpolating functions in various transformed spac es linear , log log, etc. with derivatives • Constr ucting functions of functions inline binaries, c omposition, inverse functions, etc. • F unction metadata such a s domain and information about int eresting points in the form of a sampling grid • N umerical algorithms which are highl y e cient on functions with derivatives adaptive int egration, root nding • T ools t o adaptivel y c onver t expensive proc edural functions int o e cient splines t o any speci ed accuracy

Marcus H. Mendenhall, February 1315, 2008

Why? • There is a need for a uni ed packa ge t o al low mana gement of tabulat ed data sets and smooth functions. • M any physics issues depend intrinsical ly on derivatives of functions E&M eld solutions, e.g. . • Fa st, e cient int egration and root nding are useful t ools to ha ve universal ly a vailable solving Coulomb c ol lisions, e.g. . • M any instanc es arise in c omplex packa ges such a s Geant4 where multiple entities need t o share ownership of an object.

Marcus H. Mendenhall, February 1315, 2008

A to o lk it fo r d at a d ri ve n co m p ut in g in G ea n t4

Presented by Marcus H. Mendenhall Vanderbilt University

This document is provided by JAXA.

(2)

190

Marcus H. Mendenhall, February 1315, 2008

c2_factory<G4double> c2; typedefc2_ptr<G4double> G4_c2_ptr; classG4ScreenedCoulombClassicalKinematics:public G4ScreenedCoulombCrossSectionInfo, publicG4ScreenedCollisionStage { public: G4ScreenedCoulombClassicalKinematics(); protected: // the c2_functions we need to do the work. c2_const_plugin_function_p<G4double> &phifunc; c2_linear_p<G4double> &xovereps; G4_c2_ptr diff; }; G4ScreenedCoulombClassicalKinematics::G4ScreenedCoulombClassicalKinematics() : phifunc(c2.const_plugin_function()), xovereps(c2.linear(0.,0.,0.)), diff(c2.quadratic(0.,0.,0.,1.)-xovereps*phifunc)

{ } xovereps.reset(0.,0.0, au/eps);// slope of x*au/eps term phifunc.set_function(&(screen->EMphiData.get())); // install interpolating table G4double xx1, phip, phip2; G4int root_error; xx1=diff->find_root(phifunc.xmin(), std::min(10*xx0*au,phifunc.xmax()), std::min(xx0*au, phifunc.xmax()), beta*beta*au*au, &root_error, &phip, &phip2)/au;

protected: //thec2_functionsweneedtodothework. c2_const_plugin_function_p<G4double>&phifunc; c2_linear_p<G4double>&xovereps; G4_c2_ptrdiff; xovereps.reset(0.,0.0,au/eps);//slopeofx*au/epsterm phifunc(c2.const_plugin_function()), xovereps(c2.linear(0.,0.,0.)), diff(c2.quadratic(0.,0.,0.,1.)-xovereps*phifunc)

Example: U sing the root nder

phifunc.set_function(&(screen->EMphiData.get()));//installinterpolatingtable xx1=diff->find_root(phifunc.xmin(),std::min(10*xx0*au,phifunc.xmax()), std::min(xx0*au,phifunc.xmax()),beta*beta*au*au,&root_error,&phip,&phip2)/au; Marcus H. Mendenhall, February 1315, 2008

Example: sampling a cla ssic c function

// enter with func being the conventional function staticc2_factory<G4double> c2; typedefc2_ptr<G4double> c2p; // embed the normal ‘c’ function func in a c2_function c2p classic=c2.classic_function(func); // create an efficient representation, // using no derivative information c2p sample1=c2.interpolating_function().sample_function (classic,xmin, xmax, 1e-4, 1e-4); // sample1 can be evaluated quickly and efficiently // between xmin & xmax to 1e-4 absolute & relative error. // If the function is nicer in log-log space, do: c2p sample1=c2.log_log_interpolating_function(). sample_function(classic,xmin, xmax, 1e-4, 0);

// Note that only relative errors make sense for log // but the absolute error of the log is the relative error // of the function

Marcus H. Mendenhall, February 1315, 2008

Example: sampling a smooth function

// enter with func being the c2_function to be plotted, // and its domain set to the desired plotting range staticc2_factory<G4double> c2; typedefc2_ptr<G4double> c2p;

// make sure our access to func is managed, // if passed in from the outside // This is always a safe thing to do. c2p funcp=func;

// create an efficient representation, // using all derivative information c2p sample1=func.adaptively_sample( func.xmin(), func.xmax(), 1e-6, 1e-6); // sample1 can be evaluated quickly and efficiently. Marcus H. Mendenhall, February 1315, 2008

Sampling F unctions • P roblem: • Some function is ver y expensive t o c omput e, and needs t o be used repeat edl y. • Solution: • Generat e an int erpolating function representation of it • Issues: • In general, one must know quit e a bit about the function in advanc e to know how t o sample it t o pro vide bounded errors • This mak es it hard t o do without cust om c ode • Complet e solution: • U se an error

control

ling adaptive sampler • Al low function t o carr y some metadata about its str ucture

This document is provided by JAXA.

(3)

191

Marcus H. Mendenhall, February 1315, 2008

Joining F unctions Smoothl y • Tak e any tw o c2_functions and smoothl y c onnect aut omatical ly • Oft en nec essar y t o c onnect an appro ximat e function t o an a sympt otic form • Also useful for lling in regions of functions which are di

cult t o c omput e numerical ly / , e.g.

exp x/ exp x/ + error connect or

c2p conn=c2.connector_function(left_func.xmax(), left_func, right_func.xmin(), right_func, auto_center, center_val); c2_piecewise_function<double> &piece=c2.piecewise_function(); c2p keep_piece(piece); piece.append_function(left_func); piece.append_function(conn); piece.append_function(right_func); Marcus H. Mendenhall, February 1315, 2008

Comparison of splines

dhllb

020000400006000080000 Resistance (ohms)-50

-40

-30

-20

-100

10

20

30

40

50 Temperature (C)

Data table

3-point Arrhenius 2-point Arrhenius 2-point log-log

Arrhenius Cubic Spline Comparison Yellow Springs 2252 type B material

Marcus H. Mendenhall, February 1315, 2008

Example: Transformed Splines

from c2_function import * t0=273.15 a=arrhenius_interpolating_func().load( [-40+t0,40+t0],[75790, 1200], True,0,True,0)

#a=c2_function.arrhenius_interpolating_func().load( #[-40+t0,t0, 40+t0],[75790, 7355, 1200], True,0,True,0) # in c++, this would be:c2p b=c2.inverse_function(a)-c2.constant(t0); b=c2inverse_function(a)-c2constant(t0) r0 = b.xmin() r1 = b.xmax() xv=vectorDouble() yv=vectorDouble() b.adaptively_sample(r0,r1,1e-1,0,1,xv,yv) out=open("therm.dat","w") for x,y in zip(xv,yv): print >> out, x, y out.close() Marcus H. Mendenhall, February 1315, 2008

P recision int erpolation • Correct choic e of int erpolating method strongl y a ects how much information is needed t o c onstr uct the int erpolat or • choosing a c oordinat e syst em in which the function is appro ximat el y cubic or simpler al lows cubic splines t o ha ve ver y sparse sets of knots • c2_functions pro vide a rich choic e of built in int erpolat ors, and is ea sil y ext ensible • int erpolat ors can be adaptivel y populat ed f rom a function to meet speci ed error t oleranc e

This document is provided by JAXA.

(4)

192

Marcus H. Mendenhall, February 1315, 2008

Example: c omplet e program

#include "c2_factory.hh" typedefc2_ptr<double> c2p; staticc2_factory<double> c2; int main() { c2p a=c2.sin()+c2.linear(0,0,1.1); a->set_domain(0,10); c2_inverse_function_p<double> &b=c2.inverse_function(a); c2p keep_b(b); c2p hint; for(size_t loop=0; loop < 3; loop++) { switch(loop) { case 0: printf("\ninversion with no hinting\n"); hint.unset_function(); break; case 1: printf("\ninversion with rough hinting\n"); hint=c2.interpolating_function().sample_function( b, b.xmin(), b.xmax(), .1, 0.0,true, 0,true, 0); break; case 2: printf("\ninversion with detailed hinting\n"); hint=c2.interpolating_function().sample_function( b, b.xmin(), b.xmax(), .001, 0.0, true, 0,true, 0); break; default: break; } b.set_hinting_function(hint); constsize_t ntest=10; constdouble testvals[ntest]={ 0, 0.01, 5, 5.0001, 5.001, 5.01, 5.1, 6, 10, 0.01 }; for(size_t i=0; i<ntest; i++) { double xx=testvals[i]; a->reset_evaluations(); double yy=b(xx); printf("%8.4f %16.12f %4d \n", xx, yy, a->get_evaluations()); } } return 0; }

Marcus H. Mendenhall, February 1315, 2008

U se of c onnect or t o splic e theories

G4_c2_function &LJZBLScreening(G4int z1, G4int z2, size_t npoints, G4double rMax, G4double *auval){

// hybrid of LJ and ZBL, uses LJ if x < 0.5*auniv, // ZBL if x > 1.5*auniv, and // is very near the point where the functions naturally cross. G4double auzbl, aulj; c2p zbl=ZBLScreening(z1, z2, npoints, rMax, &auzbl); c2p lj=LJScreening(z1, z2, npoints, rMax, &aulj); G4double au=(auzbl+aulj)*0.5; lj->set_domain(lj->xmin(), 0.5*au); zbl->set_domain(1.5*au,zbl->xmax()); c2p conn=c2.connector_function(lj->xmax(), lj, zbl->xmin(), zbl, true,0); c2_piecewise_function_p<G4double> &pw=c2.piecewise_function(); c2p keepit(pw); pw.append_function(lj); pw.append_function(conn); pw.append_function(zbl); *auval=au; keepit.release_for_return(); return pw; }

c2pzbl=ZBLScreening(z1,z2,npoints,rMax,&auzbl); c2plj=LJScreening(z1,z2,npoints,rMax,&aulj); G4doubleau=(auzbl+aulj)*0.5; lj->set_domain(lj->xmin(),0.5*au); zbl->set_domain(1.5*au,zbl->xmax()); c2pconn=c2.connector_function(lj->xmax(),lj, zbl->xmin(),zbl,true,0); c2_piecewise_function_p<G4double>&pw=c2.piecewise_function(); c2pkeepit(pw); pw.append_function(lj); pw.append_function(conn); pw.append_function(zbl); Marcus H. Mendenhall, February 1315, 2008

Splic ed screening functions

05101520 Separation (pm)0

0.2

0.4

0.6

0.81

Screening ZBL Lens-Jensen Hybrid

Hybrid LJ-ZBL Screening Function for lithium on bismuth

This document is provided by JAXA.

参照

関連したドキュメント

We include applications to elliptic operators with Dirichlet, Neumann or Robin type boundary conditions on L p -spaces and on the space of continuous

– Solvability of the initial boundary value problem with time derivative in the conjugation condition for a second order parabolic equation in a weighted H¨older function space,

In these cases it is natural to consider the behaviour of the operator in the Gevrey classes G s , 1 &lt; s &lt; ∞ (for definition and properties see for example Rodino

The purpose of this paper is to show that the well known Murnaghan-Nakayama formula for irreducible characters of S n can be derived from the seminormal representations by a

&lt; &gt;内は、30cm角 角穴1ヶ所に必要量 セメント:2.5(5)&lt;9&gt;kg以上 砂 :4.5(9)&lt;16&gt;l以上 砂利 :6 (12)&lt;21&gt; l

Views of Kazunogawa Hydroelectric Power Station Dams &lt;Upper dam (Kamihikawa dam)&gt;. &lt;Lower dam

– Second output (output 1, in this case) will vary with the load on the main output, due to its current flowing through the winding of output 2.... Improvement #4 –

[r]