Hydrodynamic modeling of a hypothetical river diversion near empire, louisiana

In this thesis an attempt was made to build two hydrodynamic models with as much similarity as practicallypossible using two different popular finite element codes. Although for the most part the two modelsshow similar sensitivities to the model parameters tested here, differences in the models have led to some significant differences in their results. The first of these is the different model geometries necessitated by different computation time requirements resulting from the use of quadratic versus linear elements and explained in more detail in chapter 4. The second difference is in the way both models handle wetting/drying, which is explained in detail in chapter 2. It should be mentioned here that it would be possible to reconcile these differences by using RMA2’s elemental wetting/drying scheme instead of the marsh porosity option, and also allowing the RMA2 model more computation time so it could use a mesh representing exactly the same geometry as the more resolved ADCIRC mesh. However, in the interest of “fairness” to the two models, the RMA2 model was allowed use of its advanced wetting/drying scheme while ADCIRC was allowed a more resolved geometry resulting in two models with similar requirements for computation time

pdf114 trang | Chia sẻ: maiphuongtl | Lượt xem: 1931 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Hydrodynamic modeling of a hypothetical river diversion near empire, louisiana, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
marsh porosity option is unable to properly deal with anisotropic micro- topography which may favor flow in one direction over another. 77 A) ADCIRC B) RMA2 Figure 5.29 Baseline Water Surface Elevations 78 Figure 5.30 WSE Difference for Baseline Runs, ADCIRC Minus RMA2 Figure 5.31 Velocity Magnitude Difference for Baseline Runs, ADCIRC Minus RMA2 79 CHAPTER 6. SUMMARY AND RECOMMENDATIONS 6.1 Results Summary Results of the sensitivity analyses show that generally both the RMA2 and ADCIRC models respond similarly to increases in the eddy viscosity parameter. For both models it is shown that there is a lower limit for the prescribed eddy viscosity below which the models become unstable. The WSE solution only shows significant sensitivity to the eddy viscosity within the diversion channel, where larger eddy viscosity values produce steeper surface slopes. The velocity solution is more sensitive to eddy viscosity. Larger eddy viscosity values produce flatter cross-channel velocity gradients for all of the channels which are resolved in the domain. The effect is most apparent in that peak velocities may be significantly reduced by large values of eddy viscosity. Comparison to an empirically determined cross-channel velocity profile for the diversion channel suggests that even the lowest values of eddy viscosity which produce stable results under- predict peak velocities in the channels in the domain. Considering this, the best choice for an eddy viscosity value is probably the lowest value that will produce stable results. Particle tracking results show, for a given model, that the overall flow patterns are not influenced significantly by the eddy viscosity, nor is the median residence time of the diverted water. The bottom friction sensitivity tests show significant sensitivity of the WSE solution when Manning’s n in increased over the entire depth range or increased only for shallow depths. Generally increased bottom friction causes steeper WSE gradients throughout the domain and therefore higher WSE closer to the diversion channel. This effect is more pronounced when the bottom drag is increased over the whole range of 80 depth. Higher WSE leads to wetting of some of the higher areas in the domain. The resulting changes in WSE gradient and wetted area cause a slightly larger percentage of the diverted water to follow steeper gradients to the north and west and ultimately leave the domain through Lake Grande Ecaille. This shift in flow patterns can be seen in the particle tracking results. The particle tracking results also show that the median retention time of the diverted water is significantly increased by the Overall n Increase scenario. Beyond these generalizations, the sensitivities of the models the bottom friction parameters are more model specific. This is largely due to the different wet/dry algorithms, particularly that ADCIRC completely blocks flow through dry elements which can cause significant changes in flow path as areas of the mesh become wet and open to flow. 6.2 Recommendations for Future Work While the results presented in this thesis may aid future modeling efforts in calibration by showing the solution sensitivities to some of the input parameters, observed data must be collected in order to calibrate and validate future models. Proper calibration and validation will require dynamic simulations including forcing from tides, other inflows, winds, rainfall, and possibly other processes. For the RMA2 model, simulations should be run using more advanced turbulence closure schemes and model sensitivities to their respective parameters should be tested. Perhaps for the ADCIRC model a more advanced turbulence closure scheme could be implemented. In addition, a future ADCIRC model should consider the channelizing effect that ADCIRC’s wet/dry scheme produces. Carefully smoothing model geometry could be done to help smooth 81 wet/dry transitions or perhaps a new algorithm similar to RMA2’s marsh porosity, could be included in the code and applied. A 100,000 cfs diversion at Empire, LA will likely affect the flow in the river and also circulation throughout Barataria Bay. Considering this, and the fact that multiple diversions may interact with each other, future work should include building a high- resolution model which encompasses a larger portion of the Mississippi River delta and surrounding estuaries. Additionally, the modeling of sediment transport and deposition in order to simulate the potential land building abilities of large scale river diversion will require long-term (tens of years or longer) simulations. These considerations will require more computational power and therefore will probably require the use of a parallel model which can take advantage of high performance computing. Parallel ADCIRC is already available and has been widely used for simulating ocean tides, hurricane storm surge, and even a river diversion into the Maurepas Swamp. A parallel version of RMA2 has also been created with limited modifications to the serial code (Rao 2005). However parallel RMA2 has not been widely used or tested on truly large-scale problems. As water is diverted from the river and flows through a diversion structure and into the diversion channel it can be expected that complex 3-D flows will develop and vertical acceleration and vertical variation in velocity will be important. This 3-D flow may have a significant effect on hydrodynamics in the diversion and also on the sediment which the diversion captures. Modeling of this will require the use of a fully three dimensional model which could be interfaced with a larger scale 2-D model. The modeling effort should be extended to include sediment transport modeling so that long term land building abilities of proposed river diversions can be analyzed. 82 This could be done using existing sediment transport codes such as SED2D, the sediment module within TABS-MD. Another option for future sediment transport modeling would be to enhance the particle tracking model and apply it as a model for sediment transport/deposition. It could also be parallelized making simulations with large numbers of particles and long durations practical. Particles could be used to represent parcels of sediment with specific properties (mass, density, fall velocity, size etc…). Also turbulent mixing could be considered with random particle displacements and a vertical velocity profile could be assumed as in the GISPART model. Based on these considerations, sediment parcels could be tracked and their deposition modeled to give an idea or where sediment from a diversion might deposit. Results from such a sediment deposition model could be synergistically combined with results from water quality models, ecological models, and physical models to help reveal the potential land building benefits of various river diversion scenarios which in the end could aid in restoration of our rapidly disappearing coast. 83 REFERENCES Barbé, Donald E., Kevin Fagot, John A. McCorquodale. (2000). Effects on Dredging Due to Diversions From the Lower Mississippi River. Journal of Waterway, Port, Coastal, and Ocean Engineering, 126(3), 121-129. Blanton, Brian. O. (1995). DROG3D: User’s Manual for 3-Dimensional Drogue Tracking on a Finite Element Grid with Linear Finite Elements. Ocean Processes Numerical Methods Laboratory Curriculum In Marine Science University of North Carolina at Chapel Hill. Britsch, Louis D., and Joseph B. Dunbar. (1993). Land Loss Rates: Louisiana Coastal Plain. Journal of Coastal Research 9(2), 324-338. Capps, Stephen A. (2003). Modeling a Mississippi River Diversion Into a Louisiana Wetland. MS. Thesis, Louisiana State University, Baton Rouge, LA. Connor, J.J., and C.A. Brebia. (1976). Finite Element Techniques for Fluid Flow. Butterworth & Co. Ltd. Woburn, Massachusetts, USA. Day, John W., Jr., Didier Pont, Philippe F. Hensel, and Carles Ibanez. (1995). Impacts of Sea-Level Rise on Deltas in the Gulf of Mexico and the Mediterranean: The Importance of Pulsing Events to Sustainability. Estuaries, 18(4), 636-647. DeLaune, R. D., A. Jugsujinda, G. W. Peterson, and W. H. Patrick Jr. (2003). Estuarine, Coastal and Shelf Science, 58, 653-662. Donnell, Barabara, Joseph V. Letter, Jr, William H. McAnally, and William A. Thomas. (2005). Users Guide to RMA2 WES Version 4.5. U.S. Army, Engineering Research and Development Center Waterways Experiments Station. Edwards, K. P., J. A. Hare, F. E. Werner, B. O. Blanton. (2006). Lagrangian circulation on the Southeast U.S. Continental Shelf: implications for larval dispersion and retention, Continental Shelf Research, 26(12-13), 1375-1394. King, Ian P., and Lisa C. Roig. (1991). Finite Element Modeling of Flow in Wetlands. Hydraulic Engineering. Proceedings of the National Conference on Hydraulic Engineering, 286-291. Kesel, Richard H. (1988). The Decline in the Suspended Load of the Lower Mississippi River and its Influence on Adjacent Wetlands, U.S.A. Environmental Geology and Water Science, 11(3), 271-281 Kesel, Richard H. (1989). The Role of the Mississippi River in Wetland Loss in Southeastern Louisiana, U.S.A. Environmental Geology and Water Science, 13(3), 183- 193 84 Kesel, Richard H., Elaine G. Yodis, and David J. McCraw. (1992). An Approximation of the Sediment Budget of the Lower Mississippi River Prior to Major Human Modification. Earth Surface Processes and Landforms, 17, 711-722. King, Ian P., and Lisa C. Roig. (1996). The Use of an Equivalent Porosity Method to Model Flow in Marshes. North American Water and Environment Congress, 3734-3739. Kundu, Pijush K., and Ira M. Cohen. (2004). Fluid Mechanics, third edition. Elsevier Academic Press, San Deigo, California, USA. Lane, Robert R., John W. Day Jr., and Jason N. Day. (2006). Wetland Surface Elevation, Vertical Accretion, and Subsidence at Three Louisiana Estuaries Receiving Diverted Mississippi River Water. Wetlands, 26(4), 1130-1142. Letter, Joseph V. and Gregory H. Nail. (1997). Wetland Engineering in Coastal Louisiana: Naomi Siphon. U.S. Army Corps of Engineers, Wetlands Research Program Technical Note, WG-RS-7.2. Letter, Joseph V. (1997). Wetland Engineering in Coastal Louisiana: Mississippi River Delta Splays. U.S. Army Corps of Engineers, Wetlands Research Program Technical Note, WG-RS-7.1. Luettich, Rick, and Joannes Westerink. (2000). ADCIRC, A (Parallel) ADvanced CIRculation Model for Oceanic, Coastal and Estuarine Waters. U.S. Army, Engineering Research and Development Center Waterways Experiments Station. Luettich, Rick, and Joannes Westerink. (2004). Formulation and Numerical Implementation of the 2D/3D ADCIRC Finite Element Model Version 44.XX. Mashriqui, Hassan S., and G. Paul Kemp. (2004) Hydrodynamic Models of Subprovince 2. Louisiana Coastal Area(LCA) report, vol.4, app. C, ch. 4, c54-c85. Morris, James T., P. V. Sundareshwar, Christopher T. Nietch, Björn Kjerfve, and D. R. Canhoon. (2002). Responses of Coastal Wetlands to Rising Sea Level. Ecology, 83(10), 2869-2877. Park, D., M. Inoue, W. J. Wiseman, Jr., D. Justic, and G. Stone. 2004. High-Resolution Integrated Hydrology-Hydrodynamic Model: Development and Application to Barataria Basin, Louisiana. U. S. Dept. of the Interior, Minerals Management Service, Gulf of Mexico OCS Region, New Orleans, LA. OCS Study MMS2004 - 063. 74 pp. Periañez, R. (2005). GISPART: a numerical model to simulate the dispersion of contaminants in the strait of Gibraltar. Environmental Modeling & Software, 20, 797- 802. 85 Press, W. H., S. A. Teukolsky, W. T. Vetterling, and B. P. Flannery,. (1992). Numerical Recipies in c: The Art of Scientific Computing Second Edition, Cambridge University Press. Cambridge, UK. Rao, Prasada. (2005). A Parallel RMA2 model for simulating large-scale free surface flows. Environmental Modeling & software, 20(1), 47-53. Reed, Denise J. (1989). Patterns of Sediment Deposition is Subsiding Coastal Salt Marshes, Terrebonne Bay, Louisiana: the Role of Winter Storms. Estuaries, 12(4), 222- 227. Reed, Denise J. (1992). Effects of Weirs on Sediment Deposition in Louisiana Coastal Marshes. Environmental Management, 16(1), 55-65. Roig, Lisa C. (1994). Hydrodynamic Modeling of Flows in Tidal Wetlands. PhD Dissertation. University of Californina, Davis, CA. Roig, Lisa C. (1995). Mathematical Theory and Numerical Methods for the Modeling of Wetland Hydraulics. Water Resources Engineering, Proceedings of the First International Conference, San Antonio, TX, ASCE, 249-253. Turner, Eugene R., Joseph J. Baustian, Erick M. Swenson, and Jennifer S. Spicer. (2006). Wetland Sedimentation from Hurricanes Katrina and Rita. Science, 314(5798), 449-452. URS Corporation. (2006). Diversion Modeling Report, Mississippi River Re-introduction Into Maurepas Swamp, PO-29, DRAFT, URS Corporation December. 2006. Wilkerson, Gregory V., Jessican L. McGahan. (2005). Depth-Averaged Velocity Distribution is Straight Trapezoidal Channels. Journal of Hydraulic Engineering Technical Note, 131(6), 509-511. Willson, Clinton S., Nathan Dill, William Barlett, Samantha Danchuk, and Ryan Waldron. (2007). Physical and Numerical Modeling of River and Sediment Diversion in the Lower Mississippi River Delta. ASCE Coastal Sediments 2007, 1, 749-761. 86 APPENDIX. PARTICLE TRACKING CODE // maureparticle // by Nathan Dill // 11/13/06 ////////////////////////////////////////////////// ////////////////////////////////////////////////// function maureparticle // this program tracks particles through a 2d unstructured triangular mesh // using a known time varying or steady velocity field. the velocity within // an element is interpolated linearly bwtween the three nodes of the element. // particles are "moved" to new positions using either a direct Eulerian step, // or using the 2nd order Runge-Kutta method. // // the mesh may be provided as an ADCIRC type mesh named fort.14, as a RMA2 // type mesh named mesh.geo, or as generic files nodes.txt and element.txt. // in the fort.14 case, "weirs" if present are converted to elements; in the // mesh.geo case quadrilateral elements are split into triangles. // in all cases a files newfort.14(viewable in SMS), and nodes.txt // and elements.txt are made representing the weirless trianguar mesh // used for tracking. // // element to element and node to element neighbor tables are created and // used to relocate particles when they move from one element to the next. // the creation of these tables can be time consuming for large meshes, but // it is only necessary to do this once for each mesh. particles that leave // the mesh domain are brought back to the boundary perpendicular to their // position and in this manner can be tracked along the boundary or may move // back into the domain if the velocity field permits. // // One must be careful to specify a tracking timestep small enough that // particles cannot move out of an entire node-element group in one step. // a general rule could be that the timestep should be short enough prevent // a particle from moving more than half way across an element in one step. // i.e. timestep = (shortest element side)/2/(highest speed) // if the timestep is too large particles may get "lost" // ///////////////////////////////////////////////// // files necessary for maureparticle: // // fort.14, mesh.geo, or nodes.txt and elements.txt // (nodes.txt and elements.txt are the files actually read and used for tracking) // // fort.64 (ADCIRC output) // or velocity.dat (velocity ASCII file generated by SMS from RMA2's *.sol file) // // particles.inp (ASCII file with particles starting position) // format is: xstart ystart locat (locat is the starting element index, // " " " if 0 is used for locat Maureparticle // " " " will find each particles starting // " " " element, but this may take some time) // ////////////////////////////////////////////////// // files created by maureparticle: // 87 // newfort.14 (this file is for viewing mesh in SMS, it is an ADCIRC style mesh // but does not contain any boundary information) // // nodes.txt(if other mesh is given initially), format is: nid x y z // " " " " // elements.txt(if other mesh is given initially), format is: N1 N2 N3 // " " " // position.out (this is the particle position output file) // format is: for i=1:stp // TS(i) // for k=1:np // x(i,k) y(i,k) locat(i,k) // end // end // position.out may be very large, so use daytracks function(included below) // to make a more manageable output file "daytracks.tab" // /////////////////////////////////////////////////// // How to run maureparticle: // use "getf maureparticle.sci" to load the function // then direct SCILAB to the directory in which the the input files reside // run maureparticle by typing "maureparticle" at the command line // then input the answers to the questions asked. the first time a particular // mesh is used it is necessary to make node and element tables, if the tables // have already been made you can skip this part. it is necessary to know // how may words(strings) are on the first line of fort.14, or on the first // three lines of mesh.geo, also for mesh.geo it is necessary to know the // total number of element is the mesh so that the files are read in properly // the progress of maureparticle can be monitored by watching // the position.out grow. If desired, once maureparticle is finished // run the daytracks function to make a more manageable output file. // stacksize(100000000) format('v',18); global x y z nn global N1 N2 N3 ne global el2el node2el global px py locat np global TS tts tot dyn velfil global vx vy vxp vyp ttime global vx1 vx2 vy1 vy2 deltat global midnods disp('need to make node and element tables for this grid?') mktbls=input('(yes=1,no=0)'); if mktbls==1 disp('what kind of mesh file?'); grdfil=input('nodes.txt&elements.txt=0; fort.14=1; mesh.geo=2'); end tts=input('tracking timestep?(seconds)'); tot=input('total tracking time(days)?'); tot=tot*24*3600; dyn=input('steady-state(0) or dynamic(1)?') velfil=input('fort.64(0) or velocity.dat(1)?') 88 if dyn==0 & velfil==0 TS=input('velocity solution timestep for SS tracking(seconds)') end method=input('eulerian(0) or RK2(1)?') if mktbls==1 // make el2el and node2el tables if grdfil==1 // ADCIRC type mesh, may have to convert weirs to elements removeweirs elseif grdfil==2 // RMA2 type mesh, may have to split quadrilateral elements splitquads else // generic mesh, read in node.txt file and elements.txt file maketables disp('writing newfort.14') fdd=mopen('newfort.14','w') frstline='newfort file' mfprintf(fdd,'%s\n',frstline) mfprintf(fdd,'%i %i\n',ne,nn) nid=[1:nn]'; eid=[1:ne]' mfprintf(fdd,'%i %18.8f %18.8f %18.8f\n',nid,x,y,z) three=zeros(ne,1); three(:,:)=3; mfprintf(fdd,'%i %i %i %i %i\n',eid,three,N1,N2,N3) mclose(fdd) clear('three','nid','eid') end else readfiles1 end readfiles2 /////////////////////////////////////////////////////////////////////////////////// // find starting elements for particles if locat(1)==0 disp 'locating particles' for i=1:np for j=1:ne // clculate cross product to find what element particle is in locat(i)=j; ds1=[x(N1(j))-px(i) y(N1(j))-py(i)]; ds2=[x(N2(j))-px(i) y(N2(j))-py(i)]; ds3=[x(N3(j))-px(i) y(N3(j))-py(i)]; cros1=det([ds1; ds2]); cros2=det([ds2; ds3]); cros3=det([ds3; ds1]); if cros1>=0 & cros2>=0 & cros3>=0 break end end end end 89 /////////////////////////////////////////////////////// // begin writing output out=mopen('position.out','w'); time=0; mfprintf(out,'%i\n',time); mfprintf(out,'%18.8f %18.8f %i\n',px,py,locat); //////////////////////////////////////////////////// // read inital velocity field if dyn==0 & velfil==0 disp('reading fort.64, steady-state') read64std end if dyn==0 & velfil==1 disp('reading velocity.dat, steady-state') readdatstd end if dyn==1 & velfil==0 disp('reading fort.64, dynamic') ttime=0; read64dyn end if dyn==1 & velfil==1 disp('reading velocity.dat, dynamic') ttime=0 readdatdyn end ///////////////////////////////////////////////////////// // track particles steady state if dyn==0 disp('tracking particles, steady-state') stp=tot/tts for iii=1:stp // track loop [vxp,vyp]=velinterp(px,py) if method==1 px1=px; py1=py; end // find new positions Euler method px=px+tts*vxp; py=py+tts*vyp; time=time+tts; if method==1 // RK2 method px2=px; py2=py; pxmid=(px1+px2)/2; pymid=(py1+py2)/2; [vxp,vyp]=velinterp(pxmid,pymid) px=px1+tts*vxp; py=py1+tts*vyp; elcheck // update elemental location, and 90 // if left boundary, the position else // using Euler method elcheck end mfprintf(out,'%i\n',time); mfprintf(out,'%18.8f %18.8f %i\n',px,py,locat); end // track loop, for iii end // if dyn==0 //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// // track particles dynamic if dyn==1 disp('tracking particles, dynamic') stp=tot/tts for iii=1:stp // dynamic track loop if ttime==1 //read the next velocity solution timestep if necessary vx1=vx2; vy1=vy2; if velfil==0 [n,secs2,j1]=mfscanf(1,fd64,'%f%f'); [n,NID,vx2,vy2]=mfscanf(nn,fd64,'%i%f%f'); clear NID else [n,junk]=mfscanf(2,veldat,'%s'); clear junk; [n,hours2]=mfscanf(1,veldat,'%f') [n,one]=mfscanf(lne,veldat,'%i'); clear one; [n,vx2,vy2]=mfscanf(lnn,veldat,'%f%f') vx2(midnods)=[] vy2(midnods)=[] end ttime=0 end vx=vx1+(vx2-vx1)*ttime; vy=vy1+(vy2-vy1)*ttime; [vxp,vyp]=velinterp(px,py) if method==1 px1=px; py1=py; end // find new positions Euler method px=px+tts*vxp; py=py+tts*vyp; time=time+tts; if method==1 // RK2 method px2=px; py2=py; pxmid=(px1+px2)/2; 91 pymid=(py1+py2)/2; [vxp,vyp]=velinterp(pxmid,pymid) px=px1+tts*vxp; py=py1+tts*vyp; elcheck else // using Euler method elcheck end mfprintf(out,'%i\n',time); mfprintf(out,'%18.8f %18.8f %i\n',px,py,locat); ttime=ttime+tts/deltat end // dyn track loop, for iii end // if dyn==1 ////////////////////////////////////////////////////////// mclose('all') endfunction // maureparticle ///////////////////////////////////////////////////// //------------------------------------------------------------------------------------- ////////////////////////////////////////////////////// ///////////////////////////////////////////////////// function removeweirs // // this function converts any weirs in the ADCIRC mesh // into elements so that particles can be tracked over // the weirs if necessary. it also builds the el2el // and node2el tables. it writes out files: // el2el.tbl, node2el.tbl, nodes.txt, elements.txt // and newfort.14(without any boundaries) // // stacksize(10000000) format('v',18); //read first two lines words=input('how many words are on first line of fort.14?') fd=mopen('fort.14','r'); fd2=mopen('newfort.14','w'); ffd=mopen('nodes.txt','w'); fffd=mopen('elements.txt','w') [n,s1]=mfscanf(words,fd,'%s'); // see how many words are on first line of fort.14 mfprintf(fd2,'%s ',s1); // you may need to read more strings mfprintf(fd2,'\n') [n,ne,nn]=mfscanf(1,fd,'%f %f'); // read nodes disp('reading nodes') x=zeros(nn,1); y=zeros(nn,1); z=zeros(nn,1); for i=1:nn 92 [n,id,xx,yy,zz]=mfscanf(1,fd,'%i%s%s%s'); // read as strings so not to loose precision! x(i)=evstr(xx); y(i)=evstr(yy); z(i)=evstr(zz); nid(i)=id; end mfprintf(ffd,'%i %18.8f %18.8f %18.8f\n',nid,x,y,z) mclose(ffd) //read elements disp('reading elements') [n,eid,three,N1,N2,N3]=mfscanf(ne,fd,'%i%i%i%i%i'); elements=[]; elements=[N1, N2, N3]; //read open boundries [n,nopen,j1,j2,j3,j4,j5]=mfscanf(1,fd,'%i%s%s%s%s%s'); //read strings for " = number of open boundaries" [n,nopenn,j1,j2,j3,j4,j5,j6,j7]=mfscanf(1,fd,'%i%s%s%s%s%s%s%s'); for i=1:nopen [n,nobn,j1,j2,j3,j4,j5,j6,j7,lb]=mfscanf(1,fd,'%i%s%s%s%s%s%s%s%i'); [n,nobid]=mfscanf(nobn,fd,'%i'); end // read land boundaries create new elements from weirs [n,nland,j1,j2,j3,j4,j5]=mfscanf(1,fd,'%i%s%s%s%s%s'); [n,nlandn,j1,j2,j3,j4,j5,j6,j7]=mfscanf(1,fd,'%i%s%s%s%s%s%s%s'); cnt=0 for q=1:nland [n,nnp,typ]=mfscanf(1,fd,'%i%i'); if typ==24 | typ==4 [n,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10]=mfscanf(1,fd,'%s%s%s%s%s%s%s%s%s%s'); [n,N1,N2,elev,Wc1,Wc2]=mfscanf(nnp,fd,'%i%i%f%f%f'); //create elements from nodestring pairs cnt=cnt+1 //disp('creating new elements from weir nodestring pairs') z1=z(N1); z2=z(N2); x1=x(N1); x2=x(N2); y1=y(N1); y2=y(N2); ds1=[(x1(2)-x1(1)),(y1(2)-y1(1))]; //determine which way is counter clockwise ds2=[(x2(1)-x1(1)),(y2(1)-y1(1))]; cross=ds1(1)*ds2(2)-ds1(2)*ds2(1); if cross>0 // N2 is on N1's left EE=[]; ee=[]; for i=1:nnp-1 93 ee=[N1(i) N1(i+1) N2(i); N2(i) N1(i+1) N2(i+1)]; EE=[EE;ee]; end else // N2 on right EE=[]; ee=[]; for i=1:nnp-1 ee=[N2(i) N2(i+1) N1(i); N1(i) N2(i+1) N1(i+1)]; EE=[EE;ee]; end end elements=[elements;EE]; elseif typ==3 | typ==13 | typ==23 [n,j1,j2,j3,j4,j5,j6,j7,i1]=mfscanf(1,fd,'%s%s%s%s%s%s%s%s'); [n,NID1,elev,Wc1]=mfscanf(nnp,fd,'%i%f%f'); else [n,j1,j2,j3,j4,j5,j6,j7,i1]=mfscanf(1,fd,'%s%s%s%s%s%s%s%s'); [n,NID1]=mfscanf(nnp,fd,'%i'); end end if cnt>0 disp(cnt,'created elements from nodestring pairs') end mclose(fd); ne=length(elements(:,1)); mfprintf(fd2,'%i %i\n',[ne nn]); mfprintf(fd2,'%i %18.8f %18.8f %18.8f\n',nid,x,y,z); eid=[1:ne]'; three=zeros(ne,1); three(:,:)=3; mfprintf(fd2,'%i %i %i %i %i\n',[eid three elements]); mclose(fd2); mfprintf(fffd,'%i %i %i\n',[elements]) mclose(fffd) maketables // make el2el and node2el endfunction //removeweirs ///////////////////////////////////////////////////// //--------------------------------------------------------------------------------------- ///////////////////////////////////////////////////// ///////////////////////////////////////////////////// function splitquads // // Nathan Dill 94 // 9/11/06 // this script reads the RMA2 *.GEO file, splits any // quadrilateral elements into two triangle elements, // then writes a files new_nodes.txt and new_elements.txt // with the new elements added at the end // also writes out newfort.14 for viewing in sms // and corner_index.txt which is an index // to the original corner node numbers necessary for // getting the proper velocities at corner // nodes only from velocity.dat format('v',18); stacksize(100000000); fd=mopen('mesh.geo','r'); //words=6; //ne=6776 words=input('how many words are on first lines of mesh.geo?') ne=input('how many elements in mesh?') [n,j1]=mfscanf(words,fd,'%s'); clear('j1'); // read elements disp('reading elements') [n,GE,eid,n1,n2,n3,n4,n5,n6,n7,n8,one,zero]=mfscanf(ne,fd,'%s%i%i%i%i%i%i%i%i%i%i%f'); clear('GE','one','zero'); // read nodes disp('reading nodes') [n,GNN,nid,xx,yy,zz]=mfscanf(-1,fd,'%s%i%s%s%s'); nn=length(nid) mclose(fd) x=zeros(nn,1); y=zeros(nn,1); z=zeros(nn,1); for i=1:nn x(i)=evstr(xx(i)); y(i)=evstr(yy(i)); z(i)=evstr(zz(i)); end clear('xx','yy','zz','GNN') //corner nodes NN1=n1; NN2=n3; NN3=n5; N4=n7; // remove midside nodes midnodes=[n2; n4; n6; n8;]; count=0 for i=1:length(midnodes) k=find(midnodes(i)==nid); nid(k)=[]; x(k)=[]; y(k)=[]; z(k)=[]; 95 if length(k)>0 count=count+1; end end if count>0 disp(count,'removed midside nodes') end /// create index to renumber elements. index=zeros(max(nid),1); for i=1:length(index) k=find(nid==i); index(i)=k end // redefine elements with indexed node numbers N1=index(NN1); N2=index(NN2); N3=index(NN3); disp('writing nodes.txt') ffd=mopen('nodes.txt','w') mfprintf(ffd,'%i %18.8f %18.8f %18.8f\n',nid,x,y,z); mclose(ffd) // split quadrillateral elements // try not to make thin triangles disp('splitting quadrillateral elements') quadels=find(N4~=0); newels=[] for i=1:length(quadels) j=quadels(i) xx=[x(N1(j));x(N2(j));x(N3(j));x(index(N4(j)))]; yy=[y(N1(j));y(N2(j));y(N3(j));y(index(N4(j)))]; ds1=(xx(1)-xx(3))^2+(yy(1)-yy(3))^2; ds2=(xx(2)-xx(4))^2+(yy(2)-yy(4))^2; if ds1<ds2 // connect N1 and N3 to form new elements newels=[newels;N1(j),N3(j),index(N4(j));N1(j),N2(j),N3(j)]; else // connect N2 and N4 newels=[newels;N2(j),N3(j),index(N4(j));N1(j),N2(j),index(N4(j))]; end end // add newels to old triangle elements from GEO file // keeping only corner nodes N1(quadels)=[]; N2(quadels)=[]; N3(quadels)=[]; 96 oldels=[N1,N2,N3]; numnewels=(length(newels(:,1)))/2 newels=[oldels;newels]; // this is all the elements disp(numnewels,'split quadrillateral elements') disp('writing elements.txt') fd2=mopen('elements.txt','w'); mfprintf(fd2,'%i %i %i\n',newels) mclose(fd2) disp('writing newfort.14') fdd=mopen('newfort.14','w') nid=[1:1:length(x)]' z=(-1)*z ne=length(newels(:,1)) nn=length(x) mfprintf(fdd,'%s\n','no_boundary_grid') mfprintf(fdd,'%i %i\n',ne,nn); mfprintf(fdd,'%i %f %f %f\n',nid,x,y,z) three=zeros(ne,1) three(:,:)=3; eid=[1:1:ne]' mfprintf(fdd,'%i %i %i %i %i\n',[eid three newels]) mclose(fdd) fd=mopen('corner_index.txt','w') mfprintf(fd,'%i\n',index) mclose(fd) maketables // make el2el and node2el endfunction //splitquads ///////////////////////////////////////////////////////// //----------------------------------------------------------------------------------- /////////////////////////////////////////////////////// /////////////////////////////////////////////////////// function maketables // // Nathan Dill // 10/05/06 // this function reads the nodes.txt and elements.txt files // and makes the el2el.tbl and node2el.tbl. taken and modified // from original maureparticle_1 script // // global x y z nn global N1 N2 N3 ne global el2el node2el global px py locat np global TS tts tot dyn velfil global vx vy vxp vyp ttime global vx1 vx2 vy1 vy2 deltat readfiles1 97 elements=[N1 N2 N3]; /// make node to element table disp('making node to element table'); disp('this may take some time'); fd4=mopen('node2el.tbl','w'); node2el=zeros(nn,12); for i=1:nn k=find(elements(:,1)==i | elements(:,2)==i | elements(:,3)==i); node2el(i,1:length(k))=k; mfprintf(fd4,'%i %i %i %i %i %i %i %i %i %i %i %i\n',node2el(i,:)); end mclose(fd4); ////// use find command to make element to element table !this may take some time! disp('making element to element table') disp('this will take even longer') fd3=mopen('el2el.tbl','w'); el2el=zeros(ne,3); for i=1:ne kk=[]; for j=1:3 k=find(elements(i,j)==elements(:,1)); kk=[kk k]; k=find(elements(i,j)==elements(:,2)); kk=[kk k]; k=find(elements(i,j)==elements(:,3)); kk=[kk k]; end q=find(kk==i); kk(q)=[]; w=[]; for m=1:length(kk) n=find(kk==kk(m)); if length(n)==1 w=[w n]; end if length(n)==2 w=[w n(1)]; end end kk(w)=[]; el2el(i,1:length(kk))=kk; mfprintf(fd3,'%i %i %i\n',el2el(i,:)); end mclose(fd3) endfunction // maketables //////////////////////////////////////////////////////////// //--------------------------------------------------------- /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// function readfiles1 // 98 // this function reads in nodes.txt and element.txt // // // global x y z nn global N1 N2 N3 ne global el2el node2el global px py locat np global TS tts tot dyn velfil global vx vy vxp vyp ttime global vx1 vx2 vy1 vy2 deltat disp('reading nodes.txt') fd=mopen('nodes.txt','r'); [n,nid,xx,yy,zz]=mfscanf(-1,fd,'%i %s %s %s'); nn=length(nid) x=zeros(nn,1); y=zeros(nn,1); z=zeros(nn,1); for i=1:nn x(i)=evstr(xx(i)); y(i)=evstr(yy(i)); z(i)=evstr(zz(i)); end clear('xx','yy','zz'); mclose(fd); disp('reading elements.txt') fd=mopen('elements.txt','r'); [n,N1,N2,N3]=mfscanf(-1,fd,'%i %i %i'); mclose(fd); ne=length(N1); endfunction //readfiles1 /////////////////////////////////////////////////////////////// //------------------------------------------------------------ //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// function readfiles2 // // this function reads node2el.tbl, el2el.tbl, and particles.inp // global x y z nn global N1 N2 N3 ne global el2el node2el global px py locat np global TS tts tot dyn velfil global vx vy vxp vyp ttime global vx1 vx2 vy1 vy2 deltat // read el2el table 99 disp('reading el2el.tbl') fd1=mopen('el2el.tbl','r'); [n,E1,E2,E3]=mfscanf(ne,fd1,'%i%i%i'); el2el=[E1,E2,E3]; clear E1 E2 E3; mclose(fd1); // read node2el table disp('reading node2el.tbl') fd2=mopen('node2el.tbl','r'); [n,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12]=mfscanf(nn,fd2,'%i%i%i%i%i%i%i%i%i%i%i%i'); node2el=[e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12]; clear e1 e2 e3 e4 e5 e6 e7 e8 e9 e10 e11 e12; mclose(fd2); // read particle input disp('reading starting particle positions'); fd3=mopen('particles.inp','r'); [n,pxx,pyy,locat]=mfscanf(-1,fd3,'%s%s%i'); px=evstr(pxx); py=evstr(pyy); np=length(locat); clear pxx pyy; mclose(fd3) endfunction readfiles2 ///////////////////////////////////////////////////////////// //---------------------------------------------------------- /////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// function read64std // global x y z nn global N1 N2 N3 ne global el2el node2el global px py locat np global TS tts tot dyn velfil global vx vy vxp vyp ttime global vx1 vx2 vy1 vy2 deltat fd4=mopen('fort.64','r'); [n,s1,s2,s3,s4,s5,s6]=mfscanf(1,fd4,'%s%s%s%s%s%s'); clear s1 s2 s3 s4 s5 s6 [n,nts,j2,j3,j4,j5]=mfscanf(1,fd4,'%f%f%f%f%f'); clear j2 j3 j4 j5 for i=1:nts [n,secs,j1]=mfscanf(1,fd4,'%f%f'); [n,NID,vx,vy]=mfscanf(nn,fd4,'%i%f%f'); clear NID if secs==TS break end end mclose(fd4); 100 endfunction //read64std ////////////////////////////////////////////////////////////// //----------------------------------------------------------- ///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// function readdatstd // global x y z nn global N1 N2 N3 ne global el2el node2el global px py locat np global TS tts tot dyn velfil global vx vy vxp vyp ttime global vx1 vx2 vy1 vy2 deltat fd=mopen('corner_index.txt','r') [n,index]=mfscanf(-1,fd,'%i') mclose(fd) fd=mopen('velocity.dat','r') [n,junk]=mfscanf(5,fd,'%s') [n,lnn,junk,lne]=mfscanf(1,fd,'%i%s%i') [n,junk]=mfscanf(5,fd,'%s') clear junk [n,one]=mfscanf(lne,fd,'%i') clear one [n,vx,vy]=mfscanf(lnn,fd,'%f%f') mclose(fd) k=find(index==0) vx(k)=[] vy(k)=[] endfunction // readdatstd /////////////////////////////////////////////////////////////// //------------------------------------------------------------ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// function read64dyn // // this function reads the first two timesteps of the fort.64 // and begins the velocity as a linear funciton of time. global x y z nn global N1 N2 N3 ne global el2el node2el global px py locat np global TS tts tot dyn velfil global vx vy vxp vyp ttime global vx1 vx2 vy1 vy2 deltat fd64=mopen('fort.64','r'); [n,s1,s2,s3,s4,s5,s6]=mfscanf(1,fd4,'%s%s%s%s%s%s'); clear s1 s2 s3 s4 s5 s6 101 [n,nts,j2,j3,j4,j5]=mfscanf(1,fd4,'%f%f%f%f%f'); clear j2 j3 j4 j5 [n,secs1,j1]=mfscanf(1,fd4,'%f%f'); [n,NID,vx1,vy1]=mfscanf(nn,fd4,'%i%f%f'); [n,secs2,j1]=mfscanf(1,fd4,'%f%f'); [n,NID,vx2,vy2]=mfscanf(nn,fd4,'%i%f%f'); clear NID deltat=secs2-secs1 endfunction // read64dyn //////////////////////////////////////////////////////////// //---------------------------------------------------------- ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// function readdatdyn // global x y z nn global N1 N2 N3 ne global el2el node2el global px py locat np global TS tts tot dyn velfil global vx vy vxp vyp ttime global vx1 vx2 vy1 vy2 deltat global midnods fd=mopen('corner_index.txt','r') [n,index]=mfscanf(-1,fd,'%i') mclose(fd) veldat=mopen('velocity.dat','r') [n,junk]=mfscanf(5,veldat,'%s') [n,lnn,junk,lne]=mfscanf(1,veldat,'%i%s%i') [n,junk]=mfscanf(4,veldat,'%s') [n,hours1]=mfscanf(1,veldat,'%f') clear junk [n,one]=mfscanf(lne,veldat,'%i') clear one [n,vx1,vy1]=mfscanf(lnn,veldat,'%f%f') midnods=find(index==0) vx1(midnods)=[] vy1(midnods)=[] [n,junk]=mfscanf(2,veldat,'%s'); clear junk; [n,hours2]=mfscanf(1,veldat,'%f') [n,one]=mfscanf(lne,veldat,'%i'); clear one; [n,vx2,vy2]=mfscanf(lnn,veldat,'%f%f') vx2(midnods)=[] vy2(midnods)=[] deltat=(hours2*3600)-(hours1*3600); endfunction // readdatdyn 102 //////////////////////////////////////////////////////////// //---------------------------------------------------------- /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// function [vxpp,vypp]=velinterp(ppx,ppy) // // this function lineraly interpolates the velocity at the current // position (px,py) of the particles within the element locat. // the components of velocity are considered separately as a plane // which passes through three points defined by the xNi,yNi,vjNi // of the element. each velocity component at the point px,py // is found as the elevation on the plane at that point. global x y z nn global N1 N2 N3 ne global el2el node2el global px py locat np global TS tts tot dyn velfil global vx vy vxp vyp ttime global vx1 vx2 vy1 vy2 deltat for i=1:np nod1=N1(locat(i)); nod2=N2(locat(i)); nod3=N3(locat(i)); // x-velocity AA=y(nod1)*(vx(nod2)-vx(nod3))+y(nod2)*(vx(nod3)-vx(nod1))+y(nod3)*(vx(nod1)-vx(nod2)); BB=vx(nod1)*(x(nod2)-x(nod3))+vx(nod2)*(x(nod3)-x(nod1))+vx(nod3)*(x(nod1)-x(nod2)); CC=x(nod1)*(y(nod2)-y(nod3))+x(nod2)*(y(nod3)-y(nod1))+x(nod3)*(y(nod1)-y(nod2)); DD=-AA*x(nod1)-BB*y(nod1)-CC*vx(nod1); vxpp(i)=-1*(AA*ppx(i)+BB*ppy(i)+DD)/CC; // y-velocity AA=y(nod1)*(vy(nod2)-vy(nod3))+y(nod2)*(vy(nod3)-vy(nod1))+y(nod3)*(vy(nod1)-vy(nod2)); BB=vy(nod1)*(x(nod2)-x(nod3))+vy(nod2)*(x(nod3)-x(nod1))+vy(nod3)*(x(nod1)-x(nod2)); CC=x(nod1)*(y(nod2)-y(nod3))+x(nod2)*(y(nod3)-y(nod1))+x(nod3)*(y(nod1)-y(nod2)); DD=-AA*x(nod1)-BB*y(nod1)-CC*vy(nod1); vypp(i)=-1*(AA*ppx(i)+BB*ppy(i)+DD)/CC; end endfunction // velinterp ////////////////////////////////////////////////////////////////////////////// //--------------------------------------------------------------------------- ///////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// function elcheck // // this function checks to see if the particles are still in the same elements // if not if first refers to the el2el table, then to the node2el table // and it updates the locat. if particle has left a boundary it places it back // on the boundary. 103 global x y z nn global N1 N2 N3 ne global el2el node2el global px py locat np global TS tts tot dyn velfil global vx vy vxp vyp ttime global vx1 vx2 vy1 vy2 deltat for i=1:np j=locat(i); ds1=[x(N1(j))-px(i) y(N1(j))-py(i)]; ds2=[x(N2(j))-px(i) y(N2(j))-py(i)]; ds3=[x(N3(j))-px(i) y(N3(j))-py(i)]; cros1=det([ds1; ds2]); cros2=det([ds2; ds3]); cros3=det([ds3; ds1]); if cros1<=0 | cros2<=0 | cros3<=0 for q=1:3 // refer to element to element table to look for particle jjj=el2el(j,q); if jjj==0 break end ds1=[x(N1(jjj))-px(i) y(N1(jjj))-py(i)]; ds2=[x(N2(jjj))-px(i) y(N2(jjj))-py(i)]; ds3=[x(N3(jjj))-px(i) y(N3(jjj))-py(i)]; cros1=det([ds1; ds2]); cros2=det([ds2; ds3]); cros3=det([ds3; ds1]); if cros1>=0 & cros2>=0 & cros3>=0 //disp 'found el2el' j=jjj; locat(i)=j; break end end if locat(i)~=jjj // find the closest node and refer to node to element table j=locat(i); // and look in those elements ds1=[x(N1(j))-px(i) y(N1(j))-py(i)]; ds2=[x(N2(j))-px(i) y(N2(j))-py(i)]; ds3=[x(N3(j))-px(i) y(N3(j))-py(i)]; mag1=sqrt(ds1(1)^2+ds1(2)^2); mag2=sqrt(ds2(1)^2+ds2(2)^2); mag3=sqrt(ds3(1)^2+ds3(2)^2); mag=[mag1 mag2 mag3]; corners=[N1(j) N2(j) N3(j)]; k=find(mag==min(mag)); closest=corners(k); 104 search=node2el(closest,:); k=find(search==0);, search(k)=[]; k=find(search==j);, search(k)=[]; for q=1:length(search) j=search(q); ds1=[x(N1(j))-px(i) y(N1(j))-py(i)]; ds2=[x(N2(j))-px(i) y(N2(j))-py(i)]; ds3=[x(N3(j))-px(i) y(N3(j))-py(i)]; cros1=det([ds1; ds2]); cros2=det([ds2; ds3]); cros3=det([ds3; ds1]); if cros1>=0 & cros2>=0 & cros3>=0 //disp 'found node2el' locat(i)=j; break end end end end if locat(i)~=j // the particle has left the domain, change its position //disp 'lost particle, move to boundary' // it may have skipped over a node-element group j=locat(i); // in which case you need to make the timestep smaller ds1=[x(N1(j))-px(i) y(N1(j))-py(i)]; // displacement vectors to nodes of element j ds2=[x(N2(j))-px(i) y(N2(j))-py(i)]; ds3=[x(N3(j))-px(i) y(N3(j))-py(i)]; mag1=sqrt(ds1(1)^2+ds1(2)^2); mag2=sqrt(ds2(1)^2+ds2(2)^2); // find the nearest node and all elements around it mag3=sqrt(ds3(1)^2+ds3(2)^2); mag=[mag1 mag2 mag3]; corners=[N1(j) N2(j) N3(j)]; k=find(mag==min(mag)); closest=corners(k); corners(k)=[] search=node2el(closest,:); k=find(search==0);, search(k)=[]; ell=[search', el2el(search,:)]; k=find(ell(:,4)==0); // this should be the two elements on the boundary bel=ell(k,1); if length(bel)==1 // closest is not on boundary ki=1 xn1=x(corners(1)); yn1=y(corners(1)); // positions of closest boundary nodes xn2=x(corners(2)); yn2=y(corners(2)); thetas=atan((yn2-yn1),(xn2-xn1)); slope=tan(thetas); if slope==0 105 slope=0.0000000001 ; end // oops divide by zero is no no newx=(slope*(py(i)-yn1+slope*xn1)+px(i))/(slope^2+1); // intersection perpendicular to boundary segemet newy=py(i)-(newx-px(i))/slope; else nods1=[N1(bel(1)) N2(bel(1)) N3(bel(1))]; // these are the nodes of the bels nods2=[N1(bel(2)) N2(bel(2)) N3(bel(2))]; els1=el2el(bel(1),:); // these are the neighbors of the bels els2=el2el(bel(2),:); nodsels1=[N1(els1(1)) N2(els1(1)) N3(els1(1)); N1(els1(2)) N2(els1(2)) N3(els1(2))] nodsels2=[N1(els2(1)) N2(els2(1)) N3(els2(1)); N1(els2(2)) N2(els2(2)) N3(els2(2))] share1=[] for pp=1:3 // loop to find shared node k=find(nodsels1==nods1(pp)); if length(k)==2 share1=nods1(pp) end end k=find(nods1==closest); nods1(k)=[]; k=find(nods1==share1); nods1(k)=[]; share2=[] for pp=1:3 k=find(nodsels2==nods2(pp)); if length(k)==2 share2=nods2(pp) end end k=find(nods2==closest); nods2(k)=[]; k=find(nods2==share2); nods2(k)=[]; nxnods=[nods1 nods2]; // these are the boundary nodes on either side of closest ds1=[x(nods1)-px(i) y(nods1)-py(i)]; // these are displacement vectors to next nodes on boundary ds2=[x(nods2)-px(i) y(nods2)-py(i)]; mag=[sqrt(ds1(1)^2+ds1(2)^2) sqrt(ds2(1)^2+ds2(2)^2)]; ki=find(mag==min(mag)) nxnod=nxnods(ki); // ki is the index of bel nxnods(ki)=[] notnod=nxnods // the other node if ki==2 notki=1 else notki=2 end xn1=x(nxnod); yn1=y(nxnod); // positions of closest boundary nodes 106 xn2=x(closest); yn2=y(closest); thetas=atan((yn2-yn1),(xn2-xn1)); slope=tan(thetas); if slope==0 slope=0.0000000001 ; end // oops divide by zero is no no newx=(slope*(py(i)-yn1+slope*xn1)+px(i))/(slope^2+1); // intersection perpendicular to boundary segemet newy=py(i)-(newx-px(i))/slope; end // if length(bel)==1 // check to see if new position is actually between boundary nodes dsb=[xn1-xn2 yn1-yn2] // displacement between boundary nodes dsnx=[newx-xn1 newy-yn1] // displacment to nxnod magb=sqrt(dsb(1)^2+dsb(2)^2); magnx=sqrt(dsnx(1)^2+dsnx(2)^2); if magnx>magb xn1=x(notnod); yn1=y(notnod); // positions of closest boundary nodes xn2=x(closest); yn2=y(closest); thetas=atan((yn2-yn1),(xn2-xn1)); slope=tan(thetas); if slope==0 slope=0.0000000001 ; end // oops divide by zero is no no newx=(slope*(py(i)-yn1+slope*xn1)+px(i))/(slope^2+1); // intersection perpendicular to boundary segemet newy=py(i)-(newx-px(i))/slope; px(i)=newx;, py(i)=newy; // assign new particle position locat(i)=bel(notki) // and element location else px(i)=newx;, py(i)=newy; // assign new particle position locat(i)=bel(ki) //disp(locat(i)) // and new element location end end //if lost end endfunction // elcheck ///////////////////////////////////////////////////////////////////////// //--------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// function daytracks(tint) 107 // this function reads the position.out file generated by maureparticle // and makes a pid,x,y,t tab delimited file "dayTracks.tab" // this file is a much more manageable size and allows for easy // examination of individual particle tracks. // "tint" is the desired(less frequent) output interval in seconds // particle tracks are listed one after another. // time is converted from seconds to days // you must know the total tracking simulation time, the tracking timestep // and the number of particles. format('v',18); //stacksize(100000000); fd1=mopen('position.out','r'); tts=input('tracking timestep (seconds)?'); totaltime=input('total tracking time (seconds)?'); np=input('number of particles?')' numints=totaltime/tint fd3=mopen('dayTracks.tab','w'); j=0 kk=0 xx=zeros(np,numints) yy=zeros(np,numints) tt=zeros(np,numints) for i=1:(totaltime/tts) // build arrays for resorting particle // postion and time data. [n,T1]=mfscanf(1,fd1,'%f'); time=zeros(np,1); time(:,:)=T1; [n,x,y,locat]=mfscanf(np,fd1,'%s%s%s'); clear locat if(T1==j) kk=kk+1 j=j+tint x=evstr(x) y=evstr(y) xx(:,kk)=x yy(:,kk)=y tt(:,kk)=time end end tt=tt./24./3600 mfprintf(fd3,'%s\t%s\t%s\t%s\n','partID','x','y','days') 108 for ii=1:np // write out particle position particle after particle ID=zeros(numints,1) ID(:,:)=ii x=xx(ii,:)' y=yy(ii,:)' t=tt(ii,:)' mfprintf(fd3,'%i\t%f\t%f\t%f\n',ID,x,y,t) end mclose('all') // endfunction // daytracks 109 VITA Nathan Lamont Dill was born February 20, 1979, in Phildelphia, Pennsylvania, to Pamela Druzilla Zimmer Dill and Richard Lamont Dill. He lived in Willingboro, New Jersey, until age three when he moved to Williamsport, Pennsylvania, with parents and two sisters. He attended public school in Williamsport. In eighth grade he competed as a mathcounts mathlete placing 111 in the state, and he also earned a perfect score on the National Science Olympiad’s physical science test. During the summer before ninth grade some home-made rocket fuel for his model rockets accidentally set fire to his bedroom but he managed to put the fire out before any significant damage was done to the house. In 1997 he won a silver medal at the PIAA District IV track meet clearing a height of 13 ft. in the pole vault. He graduated from the Williamsport Area High School in June 1997. In the fall he matriculated at Bowdoin College in Brunswick, Maine, where he pursued a major in physics. In 2000 he was awarded NCAA Division III All New England in the pole vault. On October 6, 2001 he was married in Weymouth, Massachusetts, to Janice Louise Donovan of Weymouth, daughter of Martha Louise Ferguson Donovan and Richard Jerome Donovan. In May 2002 he received his Bachelor of Arts Degree from Bowdoin College. After completing his undergraduate schooling he worked for two years as a physics teacher at the Northfield Mount Hermon School in Northfield, Massachusetts. During the summer of 2004 he moved to Baton Rouge, Louisiana, and began graduate studies in civil engineering which he thought based on prior experience might be safer than rocket science. He currently resides in Baton Rouge with his wife and three sons; Aidan Lamont, Josiah Donovan, and Paytah Jerome.

Các file đính kèm theo tài liệu này:

  • pdf27.pdf
Tài liệu liên quan