| |||||||||||||||||
Approximating PI number Description This example shows how to approximate the PI number by
executing Mosel models on a remote nodes. The C or Java XPRD program (piap.c or piap.java) connects to a remote node, there compiles the model piapprox.mos, loads it several times, runs all models instances in parallel and retrieves the result via an event message. Further explanation of this example: 'XPRD: Mosel remote invocation library reference manual'
Source Files By clicking on a file name, a preview is opened at the bottom of this page.
piapproxf.mos (!******************************************************* Mosel Example Problems ====================== file piapproxf.mos `````````````````` Approximating the value of pi by integrating the function 1/(1+x^2) over the interval [0,1]. The integral is approximated by dividing the interval [0,1] into N subintervals and calculating the sum of their areas. - Using findxsrvs to search for available servers - integral 0 to 1 1/(1+x^2)dx = arctan(1)-arctan(0) = arctan(1) = pi/4 (c) 2010 Fair Isaac Corporation author: S. Heipcke, June 2010, rev. Nov. 2018 *******************************************************!) model "approximating pi" uses "mmjobs" parameters N = 1000000 ! Number of intervals K = 20 ! Number of submodels to run NUM = 0 ! 0 in master model, else >=1 end-parameters if N<1 then exit(1); end-if declarations A = 1..K B: range modPar: array(A) of Model moselInst: array(B) of Mosel NODES: array(B) of string h: real M: integer NEWSUM = 2 ev: Event hosts:set of string end-declarations ! Start child nodes if NUM=0 then findxsrvs(1,10,hosts) ! Try to find additional hosts on the local network NODELIST:=[""] forall(i in hosts) NODELIST+=[i] forall(n in NODELIST, ct as counter) NODES(ct):=n M:= getsize(B) forall(i in B) do create(moselInst(i)) if connect(moselInst(i), NODES(i))<>0 then exit(2) elif compile(moselInst(i),"","rmt:piapproxf.mos","piapproxf.bim")<>0 then exit(3) end-if end-do forall(j in A) do load(moselInst(j mod M + 1), modPar(j), "piapproxf.bim") ! Start remote model execution run(modPar(j), "NUM="+j+",N="+N) end-do else ! Calculate a part of pi h:=1/N i:=NUM while(i <= N) do x:=h*(i-0.5) pisum+= 4/(1+x^2) i+=K end-do mypi:=h*pisum writeln(NUM, "(", getparam("NODENUMBER"), ",", getparam("JOBID"), "): ", strfmt(mypi,20,19)) end-if if NUM>0 then ! Return the solution value send(NEWSUM, mypi) else ! Add up values for parts returned by child models modct:=0 while (modct<K) do wait ev:=getnextevent if getclass(ev)=NEWSUM then mypi+=getvalue(ev) modct+=1 end-if end-do ! Solution output writeln("pi approximation: ", strfmt(mypi,20,19)) writeln("pi (built-in): ", strfmt(M_PI,20,19)) writeln("difference : ", strfmt(abs(mypi-M_PI),20,19)) end-if end-model | |||||||||||||||||
© Copyright 2024 Fair Isaac Corporation. |