<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Jun 1, 2012, at 2:23 PM, Jed Brown wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div class="gmail_quote">On Fri, Jun 1, 2012 at 1:34 PM, Blaise Bourdin <span dir="ltr"><<a href="mailto:bourdin@lsu.edu" target="_blank">bourdin@lsu.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div id=":3da">Apologies, will do next time. That would also have helped me realize that I had pushed to my own clone, not petsc-3.3 or petsc-dev repository... I am attaching the patch I was planing on submitting.<br>
<br>
Out of curiosity, what is the rationale for not wanting an explicit interface? As far as I understand, the fortran standard mandates an explicit interface in this situation (array of strings). I would understand in the situation of pure f77 compatibility for instance, but we threw this away with the iso_c_binding module anyway...<br>
</div></blockquote><div><br></div><div>Fortran modules are horribly nonportable from a build system perspective since every compiler manages them differently.</div></div></blockquote><div><br></div><div>I agree. Some compilers even change the flag names from one release to the next. </div><div><br></div><br><blockquote type="cite"><div class="gmail_quote"><div> Having the interfaces requires those extra interface files in the includes that we already hate so much, and we can't protect the headers (to make including the right ones simple like in C) because you have to include them for every subroutine.</div></div></blockquote><div><br></div>Not really. You don't need to include the modules in each subroutine or function if they are included (used) in the Program or Module in which the function is defined<br><div><br></div><div><br></div><br><blockquote type="cite"><div class="gmail_quote">
<div>I think it would be better [1] for the "modern" Fortran users for PETSc to do everything with modules, using explicit interfaces for all functions, and datatypes for PETSc objects.</div></div></blockquote><div><br></div><div>Apart for [1], I fully agree. I actually think that there should only be two way to use fortran: the old f77 way without any type checking, interface, and where all petscobjects are integer, or the right way which you described.</div><div><br></div><br><blockquote type="cite"><div class="gmail_quote"><div>Unfortunately, that forces people to spell out things like type(Mat) [2] and XGetContext() either requires an explicit interface written by the user [3] or use of the ISO C bindings in the interface [4].</div></div></blockquote><div>Not really. As long as your context is not too large (so that allocating a copy and copying the data won't kill you), you can always write a generic interface for XGetContext that returns an array of your favorite data type, then use transfer. And when your context is large, you should pass by address anyway). Conceptually, it is not really different from casting into a *void. McCormick has a nice writeup on this <a href="http://www.macresearch.org/advanced_fortran_90_callbacks_with_the_transfer_function">http://www.macresearch.org/advanced_fortran_90_callbacks_with_the_transfer_function</a></div><div><br></div><div>How does using iso_c_binding helps with a fortran library called from fortran? </div><div><br></div><blockquote type="cite"><div class="gmail_quote">
<div>I can think of no explanation for this absurdity other than that the Fortran language standards committee is the most successful global trolling agency in modern history [5].</div></div></blockquote><div><br></div><blockquote type="cite"><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; position: static; z-index: auto; ">
<div id=":3da">
Perhaps introducing f2003 in petsc was a bad idea, considering the large variety of compilers you need to support. If you feel that it introduces more issues than solving problems, feel free to strip the PetscOptionsEnum and PetscBagRegisterEnum bindings. They could easily be packaged separately for the few people who will ever need them.</div>
</blockquote></div><br><div>[1] Better, but it would be best for them to stop using Fortran.</div></blockquote><div>Why not. But what is the alternative knowing that I am not willing to give up array sections, operator overloading and vector operations? Are you going to suggest that I switch to C++? </div><br><blockquote type="cite"><div>[2] No #includes means no macros [6] and no equivalent of typedef.</div></blockquote>The only macro I would miss are CHKERRQ and SETERRQ. I would actually make an exception for these two. For numerical and string types, the fortran way of doing typedef is kind.</div><div><br></div><div><br><blockquote type="cite"><div>[3] Disaster because (a) it is maintained by the user with no way to check that it is correct and (b) the user may need multiple incompatible definitions in the same project.</div>
<div>[4] Indeed, the best way to write a Fortran library called from Fortran is to use the ISO C bindings.</div><div>[5] The people who dream up ways to link MKL and the Portland Group deserve honorable mention.</div><div>
[6] Type macros are terrible anyway because of the aforementioned punchcard nostalgia leading to different projects adopting different line/format styles and compilers having no portable way to select.</div></blockquote>I don't know of any compiler which does not default to free form for .f90/.F90 files, do you? Free format has been around for over 20 years. That some people insist on coding on 72 cols (or is it 78?) in the days of large screens is beyond me indeed. </div><div><br></div><div>So I guess that you guys don't want an explicit interface for PetscBagRegisterEnum, right? I'll fix the harmless bugs in the current binding, then.</div><div><br></div><div>Blaise</div><div><br></div><div apple-content-edited="true">
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">-- </div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">Department of Mathematics and Center for Computation & Technology</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">Louisiana State University, Baton Rouge, LA 70803, USA</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">Tel. +1 (225) 578 1612, Fax  +1 (225) 578 4276 <a href="http://www.math.lsu.edu/~bourdin">http://www.math.lsu.edu/~bourdin</a></div><div><br class="khtml-block-placeholder"></div><div><br class="khtml-block-placeholder"></div><br class="Apple-interchange-newline"></div></span></div></span><br class="Apple-interchange-newline"></div></span><br class="Apple-interchange-newline"></span><br class="Apple-interchange-newline">
</div>
<br></body></html>